首页 > 解决方案 > 如何在来自 clang 或 clang-tidy 的简单返回语句中获取隐式转换为 bool 的警告

问题描述

问题是如何在预期的情况下获得=错误使用的警告。==

在某些上下文中将-Wparentheses赋值结果隐式转换为值时,警告会发出警告。bool但是,对于只是一个简单的 return 语句的函数,该警告会在 gcc 中触发,但不会在 clang 中触发。

在下面的示例中,如果显式编写 (-DEXPLICIT),clang 和 gcc 都会发出警告,但对于较短的return *x = *y;gcc 会发出警告(带有-std=c99 -Wall),但 clang 不会。

#include <stdio.h>
#include <stdbool.h>

bool is_equal(int *x, int *y)
{
#ifdef EXPLICIT
    if(*x = *y) return true;
    else return false;
#else
    return *x = *y;
#endif
}

int main()
{
    int foo = 17;
    int bar = 42;

    bool b = is_equal(&foo, &bar);

    printf("%d %s %d\n", foo, (b?" == ":" != "), bar);
}

(这里,预期的结果is_equal是相等性测试,所以赋值是一个错误。请注意,这是一个最小的例子:对于一个简单的相等性测试,指针应该是const并因此捕获意外赋值,但在实际代码中激发了他们不可能提出的这个问题。

我还希望 clang-tidy 检查readability-implicit-bool-conversion会触发,但它没有。

更新: Clang 没有给出警告(与此相关)-Weverything,但我可以让 clang-tidy 对此发出警告吗?)

有没有办法让 clang 或 clang-tidy 警告这种 int 到 bool 的转换?

我知道它不是“危险的”,因为它定义明确且可移植,并且它可能在现有代码中很常见,但它仍然是我希望能够检查的潜在错误。

标签: cclangclang-tidy

解决方案


*x = *y:我认为您希望这是一个平等检查,但它目前是一项任务。将其更改为*x == *y, hereif(*x = *y) return true;和 here return *x = *y;

我还建议将函数签名更改为bool is_equal(const int *x, const int *y)以明确该函数不应更改输入。


推荐阅读