为什么稀疏报告sizeof(bool)警告?

时间:2014-10-21 07:44:13

标签: c boolean sizeof static-analysis

我对sparse很新,我用它来清除代码中的噪音。最近,在代码行的某处:kzalloc(sizeof(bool) * nvhost_syncpt_nb_pts(sp), GFP_KERNEL);我遇到了这个sparse警告:

warning: expression using sizeof bool 

我想知道,为什么sparse会报告此警告。在谷歌搜索,我发现sizeof(bool)是编译器相关的,这是非常明显的。请帮助我为什么sparse提出这个警告,我认为不应该报告?如果我错了,请纠正我。

我正在使用gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)。让我们说bool在这里被定义为:

#if !defined(__cplusplus)
# if defined(_MSC_VER) || !defined(__STDC_VERSION__) || \
    (__STDC_VERSION__ < 199901L)
// The Visual Studio C compiler and older versions of GCC do not support C99
// and thus have no bool or stdbool.h.  Make a simple definition of bool,
// true, and false to make this deprecated interface compile in C.  Force it
// to 1 byte to have some chance of ABI compatibility between C and C++, in
// case we don't remove this.

typedef char bool;
#  define false 0
#  define true 1
# else
// In C99-compliant compilers, we can include stdbool.h to get a bool
// definition.
#  include <stdbool.h>
# endif
#endif

/**
* @}
* End addtogroup PP
*/

#endif  /* PPAPI_C_DEV_DEPRECATED_BOOL_H_ */

1 个答案:

答案 0 :(得分:4)

如果您查看位于evaluate.c的稀疏git源树:

static struct symbol *evaluate_sizeof(struct expression *expr)
{
    ...
    if (size == 1 && is_bool_type(type)) {
        if (Wsizeof_bool)
            warning(expr->pos, "expression using sizeof bool");
        size = bits_in_char;
    }
    ...
}

ant然后在parse.c

keyword_table[] = {
    ...
    { "_Bool",  NS_TYPEDEF, .type = &bool_ctype, .op = &spec_op },
    ...
};

如果sizeof(_Bool)没有覆盖,您会看到每个Wsizeof_bool都会被报告为警告。

现在考虑你的代码:

kzalloc(sizeof(bool) * nvhost_syncpt_nb_pts(sp), GFP_KERNEL);

我不确定我们的bool是什么,但如果它是来自bool的{​​{1}}:include/linux/types.h难怪你会收到警告。至于警告背后的原因,你似乎已经自己想出来了:

typedef _Bool bool;

但是,附加文档this可能会有所帮助。

如果您认为警告与您的代码无关,请使用On googling, I found that sizeof(bool) is compiler dependent which is very obvious.删除它。