在一个C项目中(OpenVPN是涉及的项目,提交4029971240b6274b9b30e76ff74c7f689d7d9750),我们有一个bool的仿真。
typedef int bool;
#define false 0
#define true 1
现在切换到 C99 的 bool 类型
#include <stdbool.h>
但是在项目中,某处使用了错误的bool。我知道标准bool的行为不同。例如:
bool t;
t=2;
if ( t == true)
printf("True!\n");
else
printf("False!\n");
使用 stdbool.h
会返回 True!使用 #define
模拟将返回 False!
我的问题:有没有办法找到这些代码部分,它们在使用 stdbool 和模拟 bool 时表现不同?也许我忽略了一些编译器标志或者可以进行 diff 的好的 llvm 或 gcc 中间格式?
这不像上面的示例那么简单,必须是一些不容易看出来的东西。绝对不是 a == true。
更新: 我们找到了问题(mbuf_set 有一个 int 成员 len)。这有点愚蠢,但问题仍然存在,如何捕捉这些问题。我很惊讶整数溢出检查没有捕捉到这样的问题:
static inline bool
mbuf_len (const struct mbuf_set *ms)
{
return ms->len;
}
true
或false
进行比较的代码会有问题。使用更好(在我看来)的方法,只需编写if( t )
就可以了。你可以搜索true|false
,然后通过==
的命中结果进行过滤。 - unwindgetTrue
和getFalse
,它们将返回调用次数。之后,您可以搜索numberGetTrue == quantity true
来确定是否为真。 - Dmitry Zagorulkincheck_bool
的类,该类具有对bool的隐式转换。覆盖==运算符,=运算符(对于int使其为私有,对于check_bool使其为公共)。然后#define bool check_bool
。还要将true和false定义为该类的对象。 - Aneri