1

I am very new to sparse and i am using it to clean the noise from the code. Recently, somewhere in code line: kzalloc(sizeof(bool) * nvhost_syncpt_nb_pts(sp), GFP_KERNEL); I encountered this sparse warning:

warning: expression using sizeof bool 

I wonder, why sparse is reporting this warning. On googling, I found that sizeof(bool) is compiler dependent which is very obvious. Please help me why this warning is raised by sparse which i think should not be reported ? Please correct me if i am wrong.

I am using gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5). Let's say bool is defined here as:

#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_ */
Amit Sharma
  • 1,987
  • 2
  • 18
  • 29

1 Answers1

4

If you take a look in the sparse git source tree at evaluate.c in:

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 then in parse.c:

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

you will see that every sizeof(_Bool) gets reported as a warning if not overridden by Wsizeof_bool.

Now considering your code:

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

I'm not sure what our bool here is, but if it is the bool from include/linux/types.h : typedef _Bool bool; no wonder you get the warning. As for the reasoning behind the warning you seem to have figured it out by yourself:

On googling, I found that sizeof(bool) is compiler dependent which is very obvious.

But as additional documentation this may be helpful.

If you think the warning is not relevant for your code just get rid of it with -Wno-sizeof-bool.

dragosht
  • 3,237
  • 2
  • 23
  • 32