Быть чрезвычайно педантичным с тем, как ваш код компилируется

Я хотел бы выяснить, какая комбинация флагов для проверки ошибок наиболее экстремальна для g ++ (4.7). Мы не используем новую спецификацию C ++ 11, так как нам нужно кросс-компилировать код с более старыми компиляторами, и эти старые компиляторы (в основном g ++ 4.0) часто вызывают проблемы, которые просто игнорируются g ++ 4.7.

Прямо сейчас мы используем следующий набор флагов:

-Wall -Wcomment -Wformat -Winit-self -ansi -pedantic-errors \
-Wno-long-long -Wmissing-include-dirs -Werror -Wextra

но эта комбинация не идентифицирует проблемы, такие как двойной тип, передаваемый в функцию, которая ожидает int, или сравнение между подписанным и unsigned int, и это заставляет старый компилятор подавиться этим.

Я прочитал документацию и -Wsign-compare должен быть включен -Wextra но на практике кажется, что это не так, поэтому я мог что-то пропустить …

7

Решение

-ansi псевдоним для стандарта по умолчанию без расширений GNU. Я бы предложил вместо этого быть явным, используя -std=c++98, но это должно быть по умолчанию для g++ -ansiтак что не особо отличается.

Но, как правило, я никогда не видел ничего, что могло бы быть принято более новым gcc и отклонено более старым gcc на основании его недействительности. Я подозреваю, что любая такая проблема — ошибка в более старом компиляторе или его стандартной библиотеке. Gcc не имеет предупреждений о правильных вещах, но не работал со старыми версиями, поэтому у вас нет другого выбора, кроме как проверить более старую версию.

Что касается конкретных вопросов, которые вы упоминаете:

  • Передача double в функцию, которая ожидает int, не является ошибкой. Это может быть неопределенное поведение, хотя. -Wconversion должно помочь
  • Сравнение подписанного с неподписанным также хорошо определено, также всегда работает как определено и в случае сравнения на равенство фактически заставляет программистов писать хуже код (сравнение беззнаковой переменной, большей чем int с -1, это нечто иное, чем сравнение с -1u). Так что я на самом деле всегда компилирую с -Wno-sign-compare,

Компилятор не должен печатать предупреждения для заголовков, найденных в каталогах, указанных с -isystem вместо -I, так что это должно позволить вам отключить предупреждение для заголовков Qt и оставить его включенным для вашего собственного кода. Таким образом, вы должны быть в состоянии использовать -Wconversion,

3

Другие решения

использование корпия или же какой-то другой инструмент статического анализа проверить код, помимо компилятора. В моем дистрибутиве Linux, apt-get install splint получите лубок, возможно, проверьте, был ли он упакован для вашей ОС, для легкой установки.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector