[英]g++ optimization bug on osx using -O3
使用-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。
嗯,這是某種混淆代碼競賽嗎?
據我所知,您正在嘗試對輸入向量進行某種回文檢驗。 只要,
j
的硬編碼上限為2
(應該也應該是a.size()?) z
向量 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.