我对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_ */
答案 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.
删除它。