尝试理解GCC错误

5
我有以下代码段:

我有以下代码段:

#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>

template<typename Iterator>
void foo(Iterator begin, Iterator end)
{
   typedef typename std::iterator_traits<Iterator>::value_type type;
   type smallest = (*std::min_element(begin,end));
   std::cout << smallest << std::endl;
}

int main()
{
   std::list<int> l;
   l.push_back(1);   
   l.push_back(2);
   foo(l.begin(),l.end());
   return 0;
}

当我按照以下方式编译它时:
g++ -pedantic -ansi -Wall -Werror -O2 -o  test test.cpp

I get the following error:

cc1plus: warnings being treated as errors
In function ‘int main()’:
cc1plus: error: dereferencing pointer ‘pretmp.163’ does break strict-aliasing rules
cc1plus: note: initialized from here

这个错误在O3下出现,但在O1下没有。我已经使用comeau在线编译器、MS VC9.0和icc v11编译了代码,在所有情况下,代码都可以编译通过。
代码在使用std::vectorstd::dequestd::setchar*int*迭代器时运行良好,似乎是与std::list的实现非常特定有关。
我希望有人能提供一些关于这个特定错误(警告)的见解,并说明如何解决它。
注:GCC版本为:
gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我在苹果的g++中没有看到这个问题。这是哪个操作系统?我倾向于认为你使用的STL版本会有影响。 - Bill Lynch
无法在Linux上使用g++ 4.3.3重现它... - sth
4个回答

3
我已经在gcc-4.4上复制了你的错误。这是一个非错误,在Debian“不稳定版”中使用gcc-4.5和gcc-4.6时没有问题。
我曾遇到一个与gcc-4.4特定相关的有些相关的bug,类似于此提交的bug:Bug 42488 - [4.4 only] spurious strict-aliasing warning。正如@michael-burr所指出的那样,对于gcc-4.4存在大量的“strict-aliasing规则”bug:GCC Bug List: strict aliasing rules 4.4
我意识到这可能令人不满意,但我已将其视为GCC 4.4中的一个错误,并能够继续使用没有此问题的更新版本。

我同意这是编译器的一个bug。当使用Boost 1.54 property_tree库时,它也会表现出来。请参见lists.boost.org/boost-users/2010/06/59733.php。 - jfritz42

0

2
似乎更像是一种变通方法而不是解决方案...那么你的意思是gcc在这方面有问题吗? - Matthieu N.

0
只是猜测:如果你声明了foo的参数为const,可能会解决这个问题。如果我理解正确,“别名”问题会在循环中有多个指针指向同一数据时出现 - 这会导致某些优化存在潜在的操作顺序错误(这就是警告所指的)。

2
我尝试添加const,但没有任何变化。我认为问题与gnu stl中的代码有关。 - Matthieu N.

0
这是一个Bugzilla案例,似乎代表了这个问题或非常相似的问题:

这个问题在4.4.0中被标记为已修复,所以你可能遇到了另一个特殊情况,或者是什么原因导致的?但是这个bug可能会帮助你更快地解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接