试图了解GCC错误

时间:2010-01-22 01:35:57

标签: c++ gcc strict-aliasing

我有以下代码:

#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

我收到以下错误:

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不会出现此错误。我使用了在线编译器,MS VC9.0和icc v11编译了代码,并且在所有情况下代码编译都没有问题。

代码与std::vectorstd::dequestd::setchar*int*迭代器一起工作正常,似乎是std实现的特定内容::列表。

我希望有人可以提供一些有关此特定错误(警告)含义以及如何解决此问题的见解。

注意: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.

4 个答案:

答案 0 :(得分:3)

我在gcc-4.4上复制了你的错误。这是来自Debian“不稳定”的gcc-4.5和gcc-4.6的非错误。

我遇到了一个与gcc-4.4特有的相关错误,类似于提交的错误:Bug 42488 – [4.4 only] spurious strict-aliasing warning。正如@ michael-burr指出的那样,针对gcc-4.4:GCC Bug List: strict aliasing rules 4.4存在大量“严格别名规则”错误。

我意识到这有点令人不满意,但我接受这是GCC 4.4中的一个错误,并且能够转移到没有这个问题的新版本。

答案 1 :(得分:0)

没有clu'回合gnu ......但这似乎很有用:http://code.google.com/p/v8/issues/detail?id=413

答案 2 :(得分:0)

只是猜测:如果你宣称foo的args是const,它可能会解决这个问题。如果我理解正确的话,“别名”问题会出现在循环中多个指针指向同一数据的情况下 - 这会导致操作错误的潜在顺序以及一些优化(这是警告所指的内容) )。

答案 3 :(得分:0)

这是一个bugzilla案例,似乎代表了这个问题或类似的东西:

它在4.4.0中被标记为固定,所以你要么碰到另一个角落,要么就是???。但是这个错误可能会让你为你解决问题。