Попытка понять ошибку GCC

У меня есть следующий бит кода:

#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.
5
задан Keith Thompson 22 January 2012 в 21:41
поделиться

3 ответа

No Clu 'Bout Gnu ... Но это кажется полезным: http://code.google.com/p/v8/issues/detail?id=413

0
ответ дан 15 December 2019 в 06:26
поделиться

Просто опасно догадаться: если вы объявили args foo be const, это может решить эту проблему. Вопрос «псевдонима», если я правильно понимаю, приходит, когда может быть указано более одного указателя в цикле - это приводит к тому же данным - это приводит к потенциальному порядку эксплуатации ошибок с некоторыми оптимизациями (что означает, что предупреждение относится к ).

0
ответ дан 15 December 2019 в 06:26
поделиться

Вот случай Bugzilla, который, кажется, представляет эту проблему или что-то очень похоже на:

Это помечено как зафиксировано в 4.4. 0, так что вы либо столкнулись с другим угловым корпусом, либо ???. Но эта ошибка может дать вам ногу в резолюцию для вас.

0
ответ дан 15 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: