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

g++ optimization bug on osx using -O3

本文关键字:g++ 优化 错误 -O3 osx      更新时间:2023-10-16

下面的代码在使用-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,而它应该是2。

嗯,这是什么混淆代码比赛吗?

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

  • 循环变量j2的硬编码上界(可能应该是a.s size() ?)
  • 你只返回最后一个位置的检查
  • 你有各种冗余条件
  • 你有不必要的非常量参数
  • 您有未使用的z矢量
  • 对bool (1=>false -未找到,2=>true -已找到)使用不必要的int
  • 您不必要地使用了输出参数b;我用b的值替换了bool返回类型(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;
}