Подтвердить что ты не робот

Предупреждения о корректности конструкции С++

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Осторожно, параметр const, подобный этому:

void myFunc(int const param);

не принадлежит интерфейсу. Он относится к локальной области реализации функции. Фактически, эта функция:

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

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

int inc(int param);

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

-Wsuggest-attribute=const

Для этого анализа требуется опция

-fipa-pure-const

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

-O 

и выше