有没有办法在代码中检测bool
值的错误用法
#include <stdbool.h>
void *foo(void)
{
return false;
}
int bar(void)
{
return true;
}
这两个函数都被gcc
(8.3.1)和clang
(7.0.1)接受,没有任何警告
$ gcc -Wall -W -pedantic -c x.c
$ clang -Xclang -analyzer-checker=alpha --analyze -Wall -W -pedantic -c x.c
$ clang -Wall -W -pedantic -c x.c
$
编译为C ++代码将检测foo()
中的问题,但不是一个选项,但其余代码是C,而不是C ++。
是否有其他(-W
)选项或开关可以为这些情况创建诊断?
使示例不那么简单:
bool x;
void *foo(void)
{
return x;
}
int bar(void)
{
return x;
}
它想要编译。
通常真假都只是定义,有价值1
和0
来自stdbool.h头文件
#ifndef _STDBOOL_H
#define _STDBOOL_H
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#else /* __cplusplus */
在你的第一个例子中,你只返回零,大多数编译器都不会发出警告,因为它们将它视为NULL。尝试返回true
,你会得到警告。
C将<stdbool.h>
宏true
和false
定义为分别扩展为值1
和0
的整数常量表达式。由于它们是int
s和bool
(_Bool
)本身是一个整数类型,所以任何这样的用法同样有效。即使C中布尔表达式的值是int
而不是bool
,所以使用bar
函数对你没什么帮助。
然而,foo
是一个不同的野兽 - 如果返回值是true
然后它会被立即捕获因为1
不能转换为指针。 false
,具有整数常量值0
是一个空指针常量,并将转换为空指针。您可能通过将#include <stdbool.h>
替换为包含的东西来捕获错误的用法,但将false
定义为0.0
,这是一个假值但不是整数常量表达式。