微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在来自 clang 或 clang-tidy

如何解决如何在来自 clang 或 clang-tidy

问题是如何在有意使用 = 时收到错误使用 == 的警告。

警告 -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 的预期结果是一个相等测试,因此赋值是一个错误。)

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

更新: Clang 没有对 -Weverything 发出警告(与此相关),但是我可以使用 clang-tidy 来警告这个吗?)

有没有办法让 clang 或 clang-tidy 对这种 int-to-bool 转换发出警告?

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

>

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。