Больше предупреждений с -Os
Эта программа
int main()
{
int a, b;
a = b;
return 0;
}
компилируется без предупреждений или ошибок, если вы компилируете его с
g++ -Wall test.cpp
Однако, если вы скомпилируете его с оптимизацией даже на том же уровне предупреждения
g++ -Wall -Os test.cpp
Тогда он начнет жаловаться, что вы используете неинициализированные переменные!
(Примечание: реальная программа немного длиннее и не раскрывает проблему так же ясно, как этот маленький пример здесь.)
Я пытался выполнить поиск в Google, но либо не использую правильные условия поиска, либо это не известный феномен. Во всяком случае, мои вопросы в основном
- Почему компилятор выдает это предупреждение с -Os, но не с -O0, даже на том же уровне предупреждения? (Во всяком случае, я ожидал бы, что в этом небольшом примере все будет наоборот, поскольку переменные можно полностью оптимизировать, и тогда проблема исчезнет.)
- Существуют ли другие опции компилятора, которые вызывают неожиданные предупреждения, подобные этому? Поскольку я заинтересован в том, чтобы в моих программах не было ошибок, мне нравится видеть их все!
- Это известная особенность? Если так, где я могу найти это? Я попробовал поискать.
- Или это просто сбой в моей конкретной версии компилятора (gcc 4.3.2-1.1, Linux, 32 bit)?
2 ответа
Компилятору необходимо выполнить дополнительные проверки, чтобы выполнить некоторые оптимизации, что приводит к появлению дополнительных предупреждений. Краткое объяснение этого есть в соответствующей главе " Введение в GCC".
Кстати, на моей платформе (32-битная Ubuntu 12.04 на x86) код выдает предупреждения с gcc 4.6.3, gcc 4.7.0 и со снимком gcc 4.8:
uninitialized.cpp: В функции 'int main()': uninitialized.cpp:3:9: warning: переменная 'a' установлена, но не используется [-Wunused-but-set-variable] uninitialized.cpp:4:10: предупреждение: 'b' используется неинициализированным в этой функции [-Wuninitialized]
При более высоких уровнях оптимизации компилятор замечает, что вы приравниваете неинициализированные переменные. И так предупреждения.