Попытка понять ошибку GCC - PullRequest
5 голосов
/ 22 января 2010

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

#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 ]

3 голосов
/ 13 мая 2011

Я повторил вашу ошибку на gcc-4.4. Это не ошибка в gcc-4.5 и gcc-4.6 из Debian "unstable".

Я столкнулся с несколько связанной ошибкой, специфичной для gcc-4.4, похожей на эту ошибку: Ошибка 42488 & ndash; [Только 4.4] ложное предупреждение о строгом псевдониме . Как указал @ michael-burr, существует большое количество ошибок «правил строгого алиасинга» в gcc-4.4: Список ошибок GCC: строгие правила алиасинга 4.4 .

Я понимаю, что это немного неудовлетворительно, но я принял это как ошибку в GCC 4.4 и смог перейти на более новые версии, у которых нет этой проблемы.

0 голосов
/ 22 января 2010

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

0 голосов
/ 22 января 2010

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

Он помечен как исправленный в 4.4.0, поэтому вы либо столкнулись с другим угловым случаем, либо ???. Но эта ошибка может помочь вам решить проблему.

0 голосов
/ 22 января 2010

Нет подсказок о гну ... но это кажется полезным: http://code.google.com/p/v8/issues/detail?id=413

...