Этот ответ касается только GCC.
После дальнейшего расследования и комментариев, происходит больше, чем в моем предыдущем ответе. Этот фрагмент кода имеет две неинициализированные переменные, и каждый из них не обнаружен по другой причине.
Прежде всего, GCC documentation для варианта -Wuninitialized
говорит:
Поскольку эти предупреждения зависят от оптимизации, точные переменных или элементов, для которых есть предупреждения зависят от конкретных вариантов оптимизации и версии GCC, используемых ,
В предыдущих версиях руководства GCC это более четко указано. Вот отрывок из manual for GCC 3.3.6:
Эти предупреждения возможны только в оптимизирующей компиляции, поскольку они требуют информации о потоке данных, которая вычисляется только при оптимизации. Если вы не укажете -O, вы просто не получите эти предупреждения.
Кажется, текущая версия может дать некоторые предупреждения без неинициализированных переменных без -O
, но вы все равно получите намного лучшие результаты с ним.
Если я скомпилировать пример использования gcc -std=c99 -Wall -O
, я получаю:
foo.c: In function ‘NearEqual’:
foo.c:15:21: warning: ‘tauxtrouve’ is used uninitialized in this function [-Wuninitialized]
return tauxtrouve == tauxprecis ; // at this point tauxtrouve is potentially
^
(Примечание это с GCC 4.8.2, как я не установлен 4.9.x, но принцип должен быть таким же.)
Чтобы определить, что tauxtrouve
неинициализирован.
Однако, если мы частично исправить код, добавив инициализатор для tauxtrouve
(но не для totaldiff
), то gcc -std=c99 -Wall -O
принимает его без каких-либо предупреждений. Это похоже на экземпляр «ошибки», приведенной в haccks's answer.
Существует вопрос о том, действительно ли это следует рассматривать как ошибку: GCC не обещает поймать каждый возможный экземпляр неинициализированной переменной. Действительно, он не может сделать это с полной точностью, потому что это halting problem. Поэтому предупреждения, подобные этому, могут быть полезны, когда они работают, но отсутствие предупреждений не доказывает, что ваш код свободен от неинициализированных переменных! Они действительно не заменят тщательную проверку вашего собственного кода.
В bug report linked by haccks обсуждается вопрос о том, является ли ошибка даже фиксированной, или если попытка обнаружить эту конкретную конструкцию приведет к неприемлемой ложной положительной скорости для другого правильного кода.
Я понятия не имею, но, возможно, его оптимизация компилятора? Я также хочу знать. Надеюсь, мы скоро ответим. –
Что произойдет, если вы добавите флаг '-pedantic' в gcc? – avgvstvs
Я не знаком с тем, как тестируется инициализация, но проверьте https://gcc.gnu.org/wiki/Better_Uninitialized_Warnings, которые я нашел при поиске по Google. Особенно «CCP принимает значение для неинициализированных переменных». Если бы я был уверен в себе, я бы сделал этот комментарий и ответ. –