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オンラインコンパイラ、MSVC9.0およびiccv11を使用してコードをコンパイルしましたが、すべての場合でコードは問題なくコンパイルされます。

コードは、、、、、イテレータで正常に動作し、std :: std::vectorlistの実装に非常に固有のもののようです。std::dequestd::setchar*int*

この特定のエラー(警告)が何を意味するのか、そしてそれを解決する方法について誰かが洞察を提供してくれることを望んでいました。

注: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 ではエラーではありません。

私は、バグ 42488 – [4.4 のみ] spurious strict-aliasing warningに似た、gcc-4.4 に固有の多少関連するバグを経験しました。@michael-burr が指摘したように、gcc-4.4 に対して多数の「strict-aliasing rules」バグがあります: GCC Bug List: strict aliasing rules 4.4

少し物足りないと思いますが、これを GCC 4.4 のバグとして受け入れるようになり、この問題のない新しいバージョンに移行することができました。

于 2011-05-13T12:51:30.450 に答える
0

推測を危険にさらすだけです。fooの引数をconstと宣言した場合、この問題が修正される可能性があります。「エイリアシング」の問題は、私が正しく理解していれば、ループ内の複数のポインターが同じデータを指している可能性がある場合に発生します。これにより、いくつかの最適化による操作のバグの潜在的な順序が発生します(これは警告が参照しているものです) )。

于 2010-01-22T01:49:55.330 に答える
0

gnuについてはわかりません...しかし、これは役に立ちそうです:http://code.google.com/p/v8/issues/detail?id=413

于 2010-01-22T01:43:07.110 に答える
0

これは、この問題または非常に類似した問題を表していると思われるバグジラのケースです。

4.4.0 で修正済みとマークされているため、別のコーナー ケースに遭遇したか、???. しかし、このバグにより、解決策が得られる可能性があります。

于 2010-01-22T20:01:16.300 に答える