Предупреждения компилятора

15

Многие компиляторы имеют предупреждающие сообщения, предупреждающие программистов о возможных ошибках времени выполнения, логике и производительности, в большинстве случаев вы их быстро исправляете, но как насчет нефиксируемых предупреждений?

Как вы справляетесь с нефиксированными предупреждениями? Вы переписываете часть кода, или переписываете его «длинным, безрассудным способом», или отключаете все предупреждения вместе? Какой должна быть лучшая практика?

Что если вы редактируете чужой код, а в его коде есть предупреждения?

Вот хороший пример: jQuery имеет много предупреждений JavaScript, как обнаружил браузер класса Mozilla, почему разработчики jQ их не исправляют? Если вы внесете свой вклад в jQuery, вы собираетесь их исправить?

Мин-Tang
источник
7
Можете ли вы привести пример нефиксированного предупреждения?
Обратите внимание на себя - придумайте имя
1
Предупреждение по определению является предупреждением. Поэтому это не должно быть "исправлено". Так что такое нефиксированное предупреждение?
Ладья
Использование универсальных типов в Java часто генерирует предупреждение. Единственный способ исправить это - добавить @Suppress, который не очень чистый, IMO.
Майкл К

Ответы:

25

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

Немедленно исправляйте предупреждения (которые могут включать в себя отключение отдельных правил, если вы чувствуете, что это никогда не относится к вашему контексту).

FinnNk
источник
8
Эта. Я унаследовал кодовые базы с коллекциями предупреждений приличного размера; ни один из них не являются предупреждениями для всего , что мне особенно небезразлично, но то , что я делать заботиться о том , чтобы быть в состоянии увидеть совершенно новый «0 ошибка (ы), 1 предупреждение (s)» , когда я сделать что - то неправильно.
Carson63000
33

Мое мнение, что вы должны быть строгими с собой. Компилятор написан экспертами по языку. Если они сообщают, что что-то немного не так (кажется, запах кода), тогда код должен быть пересмотрен.

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

Гэри Роу
источник
1
Я определенно согласен!
Жестянщик
5
Я согласен. OP: вы должны прочитать о «разбитых окнах», как описано в Pragmatic Programmer.
Никто
9

Когда я писал на C и C ++, я включал самые строгие настройки, какие только мог, потому что хотел знать, когда что-то не имеет смысла для компилятора. Когда я закончил приводить и проверять возвращаемые значения, я был бы счастлив, потому что код был настолько правильным, насколько я мог это сделать.

Иногда я получал от кого-то код, который извергал бы предупреждения. Проверка источника показала, что они игнорируют вещи, которые были хорошей практикой программирования на C, делая их код хрупким.

Так что я думаю, что есть веские причины для строгости и времени, чтобы все исправить. Делать иначе - неаккуратно. Если бы у меня был сотрудник, который отключил предупреждения, я бы провел с ними некоторое время И менеджер объяснил, почему это действительно плохо.

жестяной человек
источник
6

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

Lareau
источник
4

Как правило, вы должны стремиться заставить компилятор молчать, чтобы новые предупреждения показывали больше. Эти предупреждения могут указывать на незначительные ошибки и должны обрабатываться соответствующим образом.

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

Спроси своего босса и действуй соответственно.


источник
2

Каждый раз, когда вы видите предупреждение компилятора, вы должны остановиться и подумать о том, действительно ли это проблема в ожидании взрыва вашего лица на сайте клиента, или что-то, что вы можете игнорировать. Хуже того, вещами, которые вы можете игнорировать СЕГОДНЯ, могут быть вещи, которые взорвутся на сайте клиента через несколько лет после, по-видимому, несвязанного изменения кода Somewhere Else.

Исправьте предупреждения. Период. Это или документируйте каждый из них, с таким количеством страниц объяснения, сколько необходимо, чтобы доказать, что это не риск, сопровождается подписанным заказом на продажу вашей любимой подруги (или порнухой), если выясняется, что это Был риск.

Джон Р. Штром
источник
2

Как правило, вы хотите, чтобы ваша сборка была без предупреждения. Предупреждения есть по причине, и часто они указывают на вполне реальные проблемы. Если вы привыкли игнорировать предупреждения компилятора, то в конечном итоге в вашей сборке их будет масса, и вы пропустите одно предупреждение, вызванное катастрофической проблемой, которая дорого обойдется вашей компании. С другой стороны, если ваша программа обычно компилируется без предупреждений, то каждое новое предупреждение немедленно замечается и может быть быстро устранено.

Сказав это, иногда компиляторы могут иметь предупреждения, которые имеют мало смысла и которые не могут быть легко исправлены. Я сталкиваюсь с этой ситуацией каждый день на работе с TI CodeComposer, который является средой разработки для TI DSP. У меня есть код C ++, который компилируется без предупреждений в Visual Studio, но приводит к странным предупреждениям в CodeComposer просто потому, что поддержка TI для стандарта C ++ могла бы быть лучше. К счастью, CodeComposer позволяет вам отключать отдельные предупреждения по отдельности, что мы и должны делать, когда нет способа исправить код, выдающий предупреждение.

Дима
источник
1

В моем случае предупреждения поступают от инструмента PyLint, и я могу отключить предупреждение для конкретной строки, добавив специальный текст в комментарии.

В большинстве случаев я этого не делаю. В большинстве случаев я изменяю код, следуя советам PyLint, потому что PyLint обычно верен. Однако не любит конструкции, которые, как правило, являются плохой идеей, но которые имеют смысл в определенном контексте. Например, он жалуется, если я поймаю все возможные исключения. Обычно, это правильно, это было бы плохой идеей. Тем не менее, в некоторых случаях я хочу перехватить все исключения, такие как отправка отчета об ошибке с подробной информацией.

Итак: почти во всех случаях избавляемся от взломов. Когда взлом действительно оправдан, добавьте комментарий, сообщающий, что с PyLint все в порядке.

Уинстон Эверт
источник
1

Некоторые из преимуществ строгости не были четко указаны в других ответах:

  1. Когда все легко исправляемые предупреждения были исправлены, оставшиеся значимые / релевантные предупреждения с большей вероятностью появятся.
  2. Если соответствующие предупреждения найдены и обработаны вовремя (до выпуска), ошибок можно избежать, что приведет к лучшему удовлетворению конечного пользователя
  3. Устранение предупреждения обычно приводит к более понятному и простому коду (например, устранение условий, которые всегда выполняются)
  4. Когда количество предупреждений приближается к 0, в команде легко согласовать политику нулевых предупреждений, которую очень легко автоматизировать в системе CI.
  5. При решении предупреждений компилятора понимание программного кода углубляется, что может привести к полезной информации о реализации (например, выявить другие ошибки или получить идеи о дальнейшей разработке кода).
  6. Сборка становится быстрее, ежедневная производительность увеличивается: IDE / компилятор имеет меньше проблем для управления и создания отчетов, поэтому компиляция происходит быстрее (это актуально только в контексте тысяч предупреждений).

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

Вилле Лайтила
источник
-1

Предупреждения и ошибки - это сообщения, которые компилятор использует, чтобы сказать программисту «что-то, что вы написали, не имело смысла» - разница между ними заключается в том, что с предупреждением компилятор желает угадать намерения программиста, тогда как с ошибкой компилятор не может даже сделать предположение.

Ошибки компилятора получит имя (я не буду говорить фиксированной ), но слишком часто, программисты (даже опытные) будут игнорировать предупреждения. Проблема с игнорированием предупреждений состоит в том, что иногда компилятор угадает неправильно, и если у вас есть более 1000 предупреждающих сообщений, легко пропустить предупреждающее сообщение, которое указывает, что компилятор неверно угадал.

С социологической точки зрения программы, которые имеют много предупреждающих сообщений, являются сломанной Windows .

Крейг Трейдер
источник
1
Не правда, много предупреждений компилятора о вещах, которые компилятор понимает на 100% и не находится в состоянии постоянного изменения (понял это раньше, понимает это сейчас, поймет в будущем), но находится в опыте авторов компилятора, часто пишется неправильно. Вы отвечаете на вопрос 3+ лет неправильно ...
jmoreno