Больше предупреждений с -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]

При более высоких уровнях оптимизации компилятор замечает, что вы приравниваете неинициализированные переменные. И так предупреждения.

Другие вопросы по тегам