【问题标题】:Make gcc warn on conversion within if使 gcc 在 if 内对转换发出警告
【发布时间】:2013-08-09 13:51:09
【问题描述】:

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

这个问题的灵感来自我最近观察到的一个错误,其中括号被错误放置,if 语句具有以下示例所示的意外行为。 我从this discussion on the comma operator 了解到这是有效的(虽然丑陋的)代码,但我想得到一个警告。 我尝试了-Wconversion -Wall -pedanticg++ (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( , ))

【问题讨论】:

  • 不确定这很容易做到,因为(可能)在某些情况下这是用来实现(某事)的。不使用默认值是个好主意... ;)
  • 你试过 Wextra 吗?
  • @Vincent 是的,没有运气:-(
  • clang 会给你一个很好的警告,看到它live,所以如果使用clang 是一个选项,那么你可能会很幸运。
  • 在这种特殊情况下,GCC 警告 -Wfloat-equal 会覆盖它。该警告是关于精确比较的,其中一个操作数是浮点类型。在 if 语句中使用浮点值执行与零的精确比较。

标签: c++ gcc comma


【解决方案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,因此需要额外搜索才能找到更好的文档)

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多