【发布时间】:2023-12-01 11:08:01
【问题描述】:
在一个 C 项目中(OpenVPN 是有问题的项目,提交 4029971240b6274b9b30e76ff74c7f689d7d9750)我们模拟了 bool
typedef int bool;
#define false 0
#define true 1
现在切换到 C99 bool
#include <stdbool.h>
但是在项目中 somewhere 对 bool 的使用不好。我知道 std bool 的行为不同。例如。
bool t;
t=2;
if ( t == true)
printf("True!\n");
else
printf("False!\n");
将返回 True! stdbool.h 和 False!使用#define 仿真。
我的问题有没有办法找到这些与 stdbool 和仿真 bool 行为不同的代码部分?也许我忽略了一些编译器标志或可以区分的良好 llvm 或 gcc 中间格式?
它不像上面的例子那么简单,但必须是不那么容易看到的东西。绝对不是 == true。
更新: 我们发现了问题(mbuf_set 有一个 int 成员 len)。这有点愚蠢,但问题仍然是如何抓住这些。我很惊讶整数溢出检查没有捕捉到这样的事情:
static inline bool
mbuf_len (const struct mbuf_set *ms)
{
return ms->len;
}
【问题讨论】:
-
只搜索布尔字面量;与
true或false进行比较的代码实际上会有问题。使用(更好,imo)方式的代码只是说if( t )就可以了。您或许可以搜索true|false,然后按==的点击次数对其进行过滤。 -
一种可能性是使用枚举而不是定义。然后,让静态代码分析器解析您的代码并检查诸如“t=2”之类的错误。但这会产生任何代码,包括“t=1”之类的代码。
-
尝试编写函数
getTrue和getFalse,这将返回调用次数。在您可以搜索 numberGetTrue == 数量true之后。 -
如果您可以使用 C++ 编译器进行编译,请尝试创建一个具有隐式转换为 bool 的类 check_bool。覆盖 == 运算符,= 运算符(对于 int 将其设为私有,对于 check_bool 将其设为公开)。然后
#define bool check_bool。还要对这个类的对象定义真假。 -
我知道它不是 C++,但 C 有时可以由 C++ 编译器编译。这是一个测试编译,用于查看 int 在何处分配/与 bool 值进行比较。