Анализ потока кода, который выполняет оптимизатор, позволяет обнаруживать потенциальные проблемы, которые не может обнаружить обычная (и более быстрая) компиляция. Проблема была всегда, компилятор просто не проверял ее.
Даже когда выдается это предупреждение, на самом деле это может не быть проблемой из-за фактического использования функции на практике; компилятор будет предполагать, что все возможные значения типов его аргументов (и любые внешние переменные, используемые в функции) могут встречаться во всех возможных комбинациях - приводя по крайней мере к одному пути, где переменная используется без присвоения значения. Ваше фактическое использование будет иметь гораздо более ограничительный набор возможных состояний, поэтому путь может никогда не возникнуть на практике. Простое решение - просто инициализировать переменную, чтобы отключить компилятор - это вам ничего не будет стоить.
Я всегда использую оптимизатор как форму статического анализа бедняка, даже когда в конечном итоге я не собираюсь использовать его в рабочем коде. Точно так же я часто использую более одного компилятора по той же причине. Некоторые компиляторы выполняют проверки, которые другие не выполняют, или генерируют сообщения с разными формулировками для одних и тех же ошибок, что часто помогает в их интерпретации для некоторых из более тупых сообщений.
Цитата:
Я доверяю компилятору больше, когда -g
флаг включен
Хотя верно, что если в компиляторе есть ошибка, она, вероятно, будет в оптимизаторе (это самая сложная часть), но для зрелого компилятора, такого как GCC, это будет очень редкой находкой. Наоборот, люди часто обнаруживают, что их рабочий код не работает при оптимизации; чаще всего код всегда был ошибочным (возможно, он полагался на неопределенное или определенное компилятором поведение), и оптимизатор только что выявил этот недостаток. Поэтому я предлагаю, если вы обнаружите, что ваш код нарушается при оптимизации, подозревайте код перед компилятором - применяется Occam's Razor.