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

我收到以下错误:

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::vector, std::deque, std::set, char*,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.
4

4 回答 4

3

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

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

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

于 2011-05-13T12:51:30.450 回答
0

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

于 2010-01-22T01:43:07.110 回答
0

这是一个似乎代表这个问题或非常相似的问题的 bugzilla 案例:

它在 4.4.0 中被标记为已修复,因此您要么遇到了另一个极端情况,要么 ???。但是这个错误可能会让你在解决方案上占得先机。

于 2010-01-22T20:01:16.300 回答
0

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

于 2010-01-22T01:49:55.330 回答