MiK13 писал(а): ↑04.11.2015 23:14
Когда-то я потерял несколько часов, не понимая почему у меня не работает программа. Т.е. не выполняется вызов функции. А причина оказалась в том, что я, набирая текст, случайно задел клавишу \, расположенную рядом с клавишей "Ввод". В результате следующая строка явилась продолжением комментария. После этого я стал транслировать все программы с опцией -Wall и добиваться, чтобы компилятор не выдавал ни одного предупреждения.
И как? Помогает?
Здесь нужно понимать, что таким манером может "вылететь из обращения" целый блок кода.
Тогда никаких предупреждений не будет. Может, я это специально закомментировал, откуда компилятор знает?
Я к тому, что на предупреждения смотреть, конечно, надо, но это не панацея.
Кстати, пользуясь случаем ещё раз помяну утилиту по имени
splint, которая есть аналог юникосовой
lint и выполняет ту же задачу что и
-Wall, только более строго.
MiK13 писал(а): ↑05.11.2015 01:29
при оптимизации -O2 и выше выдаёт аналогичное замечание вместе с предупреждением
warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]
При -O1 этого нет. И программа работает нормально.
Но при -O2 цикл почему-то становится бесконечным. Что заставляет внимательнее относиться к предупреждениям.
Причём программа зацикливается при выводе через cout. При выводе через printf зацикливания нет.
Да, интересно. Я ощущаю острую нехватку знаний в этом вопросе. А в таких случаях я стараюсь найти книгу по теме.
Стало быть, в данном случае нужна инфа по опциям оптимизации gcc.
Я в своё время искал книгу про отладчик gdb и наткнулся на книгу по gcc, автор - Артур Гриффитс.
Толком я её не читал, при беглом просмотре, отдельной главы по оптимизации не обнаружилось. Хотя инфы там вроде бы много и по ключам в том числе.
Ну, ещё нашлось вот
это и вот
это.
В общем, надо разбираться.