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

Я хотел бы узнать, который является самой чрезвычайной комбинацией флага проверки на ошибки для 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

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

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

7
nl ja de
@SteveJessop , который-WConversion подводит со спокойными заголовками, мы используем, that' s, почему it' s не включенный здесь: (
добавлено автор fritzone, источник
@BЈовић они собирают приятно:) Проблема с предупреждениями, которые испускают различные компиляторы, так как они не находятся в "синхронизации". g ++ 4.0 для MIPS испускает больше предупреждений что g ++ 4.7 на равнине x86 коробка: (
добавлено автор fritzone, источник
@SteveJessop да, that' s подход мы используем. Соберите код со всеми доступными компиляторами, которые мы имеем (в настоящее время, это включает g ++ 47, g ++ 40 (крест для миллиона команд в секунду), g ++ 46 и MSVS2010), и зафиксируйте все предупреждения. Я был просто удивлен, что более старый компилятор выкладывает больше предупреждений, чем новое (с тем же самым уровнем предупреждений). Я определенно дам выстрел, чтобы лязгать, чтобы видеть то, что происходит.
добавлено автор fritzone, источник
почему не только используют - Стена ?
добавлено автор user1095108, источник
Это - когда -Weverything (от Лязга) так интересен, это может не определить все, в чем вы нуждаетесь (если it' s не осуществленный, it' s не обнаруженный), но по крайней мере вы don' t должны бежать за флагами...
добавлено автор Matthieu M., источник
лучшее должно было бы собрать с различными версиями компилятора и видеть, собирают ли они. Это может быть сделано как работа CI
добавлено автор BЈовић, источник
Могло случиться так, что некоторые флаги, которые вы используете на самом деле, отключают некоторые предупреждения? Я только использую - Стена-Wextra , но я действительно вижу подписанные/неподписанные предупреждения сравнения.
добавлено автор Vincent Zoonekynd, источник
Используйте инструмент линта вместо этого.
добавлено автор Hans Passant, источник
@user1095108: Поскольку - Стена очень, очень, ОЧЕНЬ далека от того, чтобы быть действительно всеми предупреждениями. Это нужно было действительно назвать "-Wdefault", но исторические причины иногда довольно сильны.
добавлено автор Jan Hudec, источник
"эта комбинация не идентифицирует проблемы такой как двойное, передаваемое в к функции, которая ожидает интервал" - that' s не ошибка, просто сужающееся преобразование (-Wconversion ). К сожалению, gcc дает значение "педантичному" слову (определенно о стандартном соответствии), который отличается от как you' ve использовал его в вопросе;-) вы хотите своего рода союз каждого предупреждения, что каждый автор компилятора в мире когда-либо выходил? Обычная процедура должна прочитать gcc руководство и выбрать то, что вы любите.
добавлено автор Steve Jessop, источник
@fritzone: таким образом, по-видимому, если вы использовали лязг тогда you' d начинаются с -Weverything , обнаруживают, что некоторые предупреждения от спокойных заголовков тяжелы, и заканчиваются с -Weverything - Wno-преобразованием - Wno-что-то-еще . В этом случае ответ не, gcc doesn' у t есть выбор, который позволяет вам работать как этот.
добавлено автор Steve Jessop, источник
@fritzone: предупреждения shouldn' t должен быть в синхронизации. Если какой-либо их предупреждает, то вы обращаете внимание на предупреждение, пока это не решено. Предупреждения (кроме тех диагностика, требуемая стандартом), являются мнением из компилятора, что чему-то могло бы быть необходимо уделять внимание. При помощи нескольких компиляторов/конфигураций you' ре требуя большего количества мнений. И it' s естественный, что у различных компиляторов (даже различные версии того же самого компилятора) есть различные мнения. Так, если можно заставить код собирать с лязгом тогда, можно использовать его в качестве источника предупреждений.
добавлено автор Steve Jessop, источник
Это могло бы не быть версией компилятора, которая имеет значение. Очевидно есть проблемы, что gcc может/, диагностируют, предназначаясь для MIPS, но не, предназначаясь x86. Очевидно, you' d надеются это they' d быть взятой, поскольку мобильность выходит независимо от цели. Но просто например, если вы используете intN_t типы и they' ре, определенное к различному стандарту, печатает на различных платформах, тогда можно получить различные предупреждения, используя их.
добавлено автор Steve Jessop, источник

2 ответы

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

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

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

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

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

3
добавлено
есть много вещей, которые не принимают более старые компиляторы, и более новые компиляторы действительно принимают, такие как двусмысленность, решающая между противоречивыми специализированными шаблонами..., у нас были многие из них также:)
добавлено автор fritzone, источник
@fritzone: Да. Но они - жуки в более старом компиляторе. И компилятор обычно не обеспечивает предупреждение для вещей, которые правильны, но didn' t работают в более старой версии того компилятора, таким образом, для такого рода вещей необходимо будет проверить с более старой версией.
добавлено автор Jan Hudec, источник
@fritzone: Или по крайней мере gcc не обеспечивает такие предупреждения. I' ve, замеченный по крайней мере одно такое предупреждение в MSVC.
добавлено автор Jan Hudec, источник

Использовать линт или некоторый другой инструмент статического анализа проверять код, в дополнение к компилятору. На моем дистрибутиве Linux, склонный - добираются, устанавливают щепу доберется щепа, возможно, проверьте, было ли это упаковано для вашего OS для легкой установки.

1
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest