У меня есть следующий бит кода:
#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*
итераторы, кажется, что-то очень характерное для реализации станд.:: список.
Я надеялся, что кто-то мог обеспечить некоторое понимание, что эта конкретная ошибка (при предупреждении) средств и как пойти о разрешении его.
Примечание: Версия 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.
No Clu 'Bout Gnu ... Но это кажется полезным: http://code.google.com/p/v8/issues/detail?id=413
Просто опасно догадаться: если вы объявили args foo be const, это может решить эту проблему. Вопрос «псевдонима», если я правильно понимаю, приходит, когда может быть указано более одного указателя в цикле - это приводит к тому же данным - это приводит к потенциальному порядку эксплуатации ошибок с некоторыми оптимизациями (что означает, что предупреждение относится к ).
Вот случай Bugzilla, который, кажется, представляет эту проблему или что-то очень похоже на:
Это помечено как зафиксировано в 4.4. 0, так что вы либо столкнулись с другим угловым корпусом, либо ???. Но эта ошибка может дать вам ногу в резолюцию для вас.