C++中的常量正确性警告

25

有没有人知道C++编译器提供的任何警告,可以帮助强制实施const正确性?例如,如果任何C++方法包含一个从未在方法内修改的非const参数,那么产生一个警告会很好。我看到有一个名为-Wsuggest-attribute = const的gnu编译器警告;但是,当我使用此标志时,我收到一个错误,说它无法识别。有什么想法吗?


1
“const correctness” 实际上与方法参数或本地变量没有太大关系。cppcheck 可以在类方法上发出样式警告,这些方法同样可以被声明为 const。 - Johan Kotlinski
“-Wsuggest-attribute” 是关于 GCC 特定函数属性的,而不是关于 const 正确性的。 “attribute((const))” 与“constexpr”有些相似。 - Philipp
5个回答

5
-Wsuggest-attribute=const

此分析需要选项。
-fipa-pure-const

这默认情况下是启用的。

-O 

并且更高


5
我不认为存在这样的警告,主要是因为它是无用的。仅仅因为一个参数在调用内部没有被修改,并不意味着它应该仅仅为了这个原因而被声明为const
想一想虚函数。或许基类的设计者虽然没有在基类中修改参数,但他希望将参数是否被修改留给扩展类来决定。
此外,考虑到大型应用程序,在其中修改接口或API等成本很高。你现在可能没有必要修改参数,但打算在未来这样做。你不会现在将其声明为const,并强制进行完整的重建,可能还会在未来删除const时出现错误。

3
我明白你的观点,但我仍认为这可以作为一种警告是有用的(也许不是错误)。此外,似乎gnu编译器有一个名为-Wsuggest-attribute=const的标志;但我的g++编译器无法识别它。 - user809409
这不是我会在编译器上一直运行的功能,但偶尔打开以查看建议会很好。如果您知道一个函数不会修改变量,将其设置为const是一个好习惯,因为它允许传递const变量。 - Darinth
Rust 具有这个特性(不必要的 mut),这是我回到 C++ 时所想念的东西,因为我需要确保 API 和本地变量默认情况下是不可变的。 - phoenix

4

注意,像这样的const参数:

void myFunc(int const param);

不属于接口。它属于函数实现的本地范围。实际上,这个函数:

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

可以声明为

int inc(int param);

坚持const正确性范式,并不意味着禁止声称有修改变量的权利,但事实上并没有执行。

如果您担心const_cast,可以选择从一开始就不使用它,或者直接在代码库中搜索grep。


0

我不知道有这样的警告,而且我认为在编译器中实现它们会相当困难 - 也就是说,它们会减慢编译速度。也许一些静态分析工具有这样的功能(但我也不知道)。

至于Wsuggest-attribute=const,那是另一回事。它将建议使用gcc特定的“函数属性const”,基本上是一个数学函数,仅接收值(没有指针),不读取或更改任何静态/全局状态,并仅返回一个值(没有指针)。有关进一步描述,请参见此处:https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes


0

很遗憾,没有这样的警告。如果您尝试更改已声明为const的参数,则只会出现错误。这是因为缺少const声明不会从编译器的角度改变代码的正确性。但是,对于编译器发现潜在优化并提高代码可读性而言,const正确性非常重要。这是一种专业精神。特别是在使用引用时,const正确性是必须的。我经常参考这个链接。
当运算符(赋值、转换等)进入时,编译器本身非常严格地处理const正确性。如果这里缺少const,编译器将拒绝使用运算符,因为给定的参数是否可能被修改会产生很大的差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接