c - 如何在来自 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 的转换?
我知道它不是“危险的”,因为它定义明确且可移植,并且它可能在现有代码中很常见,但它仍然是我希望能够检查的潜在错误。
解决方案
*x = *y
:我认为您希望这是一个平等检查,但它目前是一项任务。将其更改为*x == *y
, hereif(*x = *y) return true;
和 here return *x = *y;
。
我还建议将函数签名更改为bool is_equal(const int *x, const int *y)
以明确该函数不应更改输入。
推荐阅读
- javascript - 冻结 HTML 表格中的多个标题
- node.js - 如何在断开连接的 redhat linux 7.7 系统上构建 atom
- c# - 基于图像的gridview高度变化
- c - __forceinline 生成一个函数符号 - 为什么?如何让它不这样做?
- windows - 是否有 powershell 命令来选择具有特定字符串(时间)的行并且必须打印计数值 Total calls Generated:156?
- python - 我如何将所有循环变量存储在python字典中以在django中使用
- java - 使用 Maven 导出 JavaFX 项目 (IntelliJ IDEA)
- python - 如何在 Windows 10 上的 Sublime Text 3 中重置 python 构建系统?
- tinymce - 在 Vaadin 页面上管理多个 TinyMCE 编辑器
- google-sheets - 在单个字符串中过滤结果