gcc:如何检测错误的`bool`用法

问题描述 投票:8回答:2

有没有办法在代码中检测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)选项或开关可以为这些情况创建诊断?

c gcc clang static-analysis
2个回答
2
投票

使示例不那么简单:

bool x;

void *foo(void)
{
    return x;
}

int bar(void)
{
    return x;
}

它想要编译。

通常真假都只是定义,有价值10

来自stdbool.h头文件

#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#define bool    _Bool
#define true    1
#define false   0

#else /* __cplusplus */

在你的第一个例子中,你只返回零,大多数编译器都不会发出警告,因为它们将它视为NULL。尝试返回true,你会得到警告。


1
投票

C将<stdbool.h>truefalse定义为分别扩展为值10的整数常量表达式。由于它们是ints和bool_Bool)本身是一个整数类型,所以任何这样的用法同样有效。即使C中布尔表达式的值是int而不是bool,所以使用bar函数对你没什么帮助。

然而,foo是一个不同的野兽 - 如果返回值是true然后它会被立即捕获因为1不能转换为指针。 false,具有整数常量值0是一个空指针常量,并将转换为空指针。您可能通过将#include <stdbool.h>替换为包含的东西来捕获错误的用法,但将false定义为0.0,这是一个假值但不是整数常量表达式。

© www.soinside.com 2019 - 2024. All rights reserved.