3

当使用 中的隐式转换时,有什么方法可以发出警告gccg++发出警告?ifif(25.0)

这个问题的灵感来自我最近观察到的一个错误,其中括号放错了位置,并且该if语句具有以下示例中所示的意外行为。我从关于逗号运算符的讨论中了解到,这是有效的(虽然丑陋的)代码,但我想得到一个警告。我试过-Wconversion -Wall -pedantic有没有运气g++ (GCC) 4.1.2g++ (GCC) 4.6.3

#include <cstdio>

bool passMin(float val, float minval=10.) {return minval<val;}

int main () {
  float val(20.0), minval(25.0);
  if(passMin(val), minval) printf(" pass (p( ), )"); else printf(" fail (p( ), )");
  printf("\n");
  if(passMin(val, minval)) printf(" pass (p( , ))"); else printf(" fail (p( , ))");
  printf("\n");
}

这会产生:

 pass (p( ), )
 fail (p( , ))
4

1 回答 1

1

在 C 和 C++ 中,所有表达式本质上都被评估为一个逻辑表达式:真还是假?true 是任何非零值,而 false 为零。

发生的事情是你的表情

if(passMin(val), minval)

与运算符发生冲突,该,运算符计算左侧的表达式并丢弃结果,然后继续计算右侧的表达式并返回该值。

逗号运算符具有所有运算符的最低优先级,并且是左结合的。

本质上,上面的代码意味着

void(passMin(val));
if (minVal)

任何当前的编译器都不太可能提供限制这种模式的选项,因为它非常广泛地用于指针和零检查之类的事情:

for (Node* node = list->head; node; node = node->next)
    ...

void func(const char* str) {
    assert(str);
    ...

因此,如果您确实有一个选项,您可能会削弱大多数库、STL、boost 等。

也就是说,您可能可以使用静态分析器来强制执行在您自己的代码中禁止它的代码实践。

视觉工作室:http: //msdn.microsoft.com/en-us/library/dd380660.aspx

Clang 静态分析器:http ://clang-analyzer.llvm.org/ (该页面不是很有帮助,分析器似乎带有 3.5,因此需要额外搜索才能找到更好的文档)

于 2014-04-19T06:45:55.643 回答