使用-O3在osx上的g ++优化错误

Posted

技术标签:

【中文标题】使用-O3在osx上的g ++优化错误【英文标题】:g++ optimization bug on osx using -O3 【发布时间】:2011-11-28 00:41:51 【问题描述】:

以下代码在使用 -O3 编译时会产生错误的退出代码。我认为内部循环被错误地优化了。使用 -O2 或 -fno-inline 它可以工作。生成一个更简单的示例很困难,因为任何小的更改都会导致错误消失。

编译:

/usr/bin/g++ -O3 -o bugexample bugexample.cpp

代码:

#include <vector>

int test(std::vector<char>& a, int& b)

    std::vector<int> z;
    z.push_back(10);
    z.push_back(10);

    int d = (int)a.size();

    int x = 1;
    for (int j = 0; j < 2; j++)
    
        int c = j - 1;

        for (int i = 0; i < d; i++) 
        
            if (j == 0)
            
            
            else if (i == 0)
            
            
            else
            
                if (a[j] == a[i - 1])
                
                    b = c + 1;
                    x = 2;
                
                z[i] = 1;
            
        
    

    return x;



int main(int argc, char* argv[])

    std::vector<char> a;
    a.push_back('a');
    a.push_back('a');
    int b = 1;
    return test(a,b);

编译器版本:

/usr/bin/g++ -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5666.3~123/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)

对任何网站感兴趣,或证明是我的错。

编辑:产生的退出代码是 1,而它应该是 b 2。

【问题讨论】:

你希望程序做什么,它做错了什么? 它产生什么价值?它应该产生什么价值? 如果您知道这是一个错误,只需向上游报告。我们不接受错误报告。 我非常确信这不是错误。它看起来像有严重缺陷的代码。我无法真正发现未定义的行为,但我提供了对 test 函数中特殊事物的分析 “我认为内部循环被错误地优化掉了。” 您是否考虑过查看生成的程序集?使用gcc -S 【参考方案1】:

嗯,这是某种混淆代码竞赛吗?

据我所知,您正在尝试对输入向量进行某种回文测试。只是,

循环变量j 的硬编码上限为2(也应该是a.size()?) 你只返回最后一个位置的支票 你有各种多余的条件 你有无端的非常量参数 你有未使用的 z 向量 您对 bool 不必要地使用了 int(1=>false - 未找到,2=>true - 找到) 你不必要地使用了out参数b;我将 bool 返回类型替换为 b 的值(b==-1 表示未找到匹配项)

在为这些事情简化代码时,我得到了这段代码,并且(就像您自己的代码一样)它在 g++ 4.6.1 上的所有优化级别的行为都是相同的:

#include <vector>

int test(const std::vector<char>& a)

    /* int j = 1; // was: for (int j = 1; j < 2; j++) */

    for (int i = a.size()-1; i > 1; i--) 
        if (a[1] == a[i - 1])
            return 1;

    return -1;



int main(int argc, char* argv[])

    std::vector<char> a(2, 'a');
    int b = test(a);

    return b==-1? 1 : 2;

【讨论】:

当然,但我可以进一步优化整个事情:int main() return 2; !据推测,OP 已经得到了这个奇怪的代码,因为这是他能做到的最简单的代码,并且仍然证明了他的问题。 @OliCharlesworth:仅当您假设输入是固定的 已修复; OP 的程序不使用任何输入。 @OliCharlesworth:你不明白 :) 我正在尝试找出奇怪的 test 函数应该做什么。我的猜测是,这是作业,我的提示应该可以帮助 OP 发现一些问题。 (当然,当你从字面上理解这个问题时,我不应该重构/分析他的代码,而是查看编译器输出)。所以,我跳过了这个问题。告我。 好的,但就像你说的,这并不能真正回答问题!

以上是关于使用-O3在osx上的g ++优化错误的主要内容,如果未能解决你的问题,请参考以下文章

g++ 在 -Os 处启用错误标志

g++ -O2 错误地优化了 SIMD 变量分配

获取在 OSX 上的应用程序中打开的文档的名称(python)

在 Tensorflow 中使用 Adadelta 优化器时出现未初始化值错误

不要在 GCC 中使用 -O3 标志优化特定循环 [关闭]

在 Flask Web 服务器中使用 Pyomo 时如何解决错误?