【发布时间】: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。
标签: c++ macos optimization gcc g++