Вопрос по compiler-warnings, const, c++ – Const корректность предупреждений с ++

21

Кто-нибудь знает какие-либо предупреждения, которые предоставляют компиляторы C ++, которые помогают обеспечить правильность const? Например, было бы неплохо иметь предупреждение, генерируемое любым методом C ++, содержащим неконстантный параметр, который никогда не изменяется внутри метода. Я вижу, что есть предупреждение компилятора GNU, называемое -Wsuggest-attribute = const; однако, когда я использую этот флаг, я получаю сообщение об ошибке о том, что он не распознан. Есть идеи почему?

-Wsuggest-attribute о специфичных для GCC атрибутах функций, а не о правильности констант.__attribute__((const)) чем-то похож наconstexpr. Philipp
& quot; const правильность & quot; на самом деле не имеет ничего общего с аргументами метода или локальными переменными. cppcheck может выдавать предупреждения стиля в методах класса, которые также могут быть сделаны const. Johan Kotlinski

Ваш Ответ

5   ответов
0

и я думаю, что их было бы довольно сложно реализовать в компиляторе, то есть они замедлили бы его. Может быть, некоторые инструменты статического анализа имеют такие функции (но я их тоже не знаю).

СогласноWsuggest-attribute=constэто другое дело. Он предложит использовать специфичный для gcc атрибут функции & quot;const& quot ;, которая, в основном, является математической функцией, получающей только значения (без указателей), не считывающей или не меняющей статическое / глобальное состояние и возвращающей только значение (без указателей). Для дальнейшего описания, смотрите здесь:https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

5

Осторожно,const параметр как этот:

void myFunc(int const param);

делаетnot принадлежат интерфейсу. Это относится к локальной области действия функцииimplementation, На самом деле эта функция:

int inc(int const param) { return param+1; }

может быть объявлен как

int inc(int param);

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

Если вы беспокоитесь оconst_cast Вы можете или не использовать его в первую очередь или простоgrep для этого в вашей кодовой базе.

0

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

7

что такое предупреждение существует, в основном потому, что оно бесполезно. То, что параметр не изменен внутри вызова, не означает, что его следует сделатьconst просто ради этого.

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

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

Я понимаю вашу точку зрения; Тем не менее, я все еще думаю, что это было бы полезно в качестве предупреждения (возможно, не ошибка). Кроме того, кажется, что для компилятора gnu существует флаг -Wsuggest-attribute = const; но мой компилятор g ++ его не распознает. user809409
Rust имеет эту функцию (ненужныйmut), и я скучаю по тому, что возвращаюсь на C ++ и пытаюсь убедиться, что API и локальные переменные неизменны по умолчанию.
Не та функция, которую я бы оставил включенной в компиляторе, но было бы неплохо включать ее время от времени, чтобы просматривать предложения. Если вы знаете, что функция не собирается изменять переменную, рекомендуется сделать ее константой, поскольку она позволяет передавать константные переменные.
1
-Wsuggest-attribute=const

Этот анализ требует опции

-fipa-pure-const

который включен по умолчанию в

-O 

и выше

Похожие вопросы