Using sizeof() on a structure containing a flexible array will ignore the 'flexible' part. This is maybe what is expected but maybe not, so add an option -Wflexible-array-sizeof to warn on such usage. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- evaluate.c | 3 +++ options.c | 2 ++ options.h | 1 + sparse.1 | 7 +++++++ validation/flex-array-sizeof.c | 1 - 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/evaluate.c b/evaluate.c index c1ef348a475e..cfbb6ada4153 100644 --- a/evaluate.c +++ b/evaluate.c @@ -2253,6 +2253,9 @@ static struct symbol *evaluate_sizeof(struct expression *expr) size = bits_in_char; } + if (has_flexible_array(type) && Wflexible_array_sizeof) + warning(expr->pos, "using sizeof on a flexible structure"); + if (is_array_type(type) && size < 0) { // VLA, 1-dimension only struct expression *base, *size; struct symbol *base_type; diff --git a/options.c b/options.c index 294dfd3be77a..ce88fbf6ed61 100644 --- a/options.c +++ b/options.c @@ -100,6 +100,7 @@ int Wdesignated_init = 1; int Wdo_while = 0; int Wenum_mismatch = 1; int Wexternal_function_has_definition = 1; +int Wflexible_array_sizeof = 0; int Wimplicit_int = 1; int Winit_cstring = 0; int Wint_to_pointer_cast = 1; @@ -840,6 +841,7 @@ static const struct flag warnings[] = { { "do-while", &Wdo_while }, { "enum-mismatch", &Wenum_mismatch }, { "external-function-has-definition", &Wexternal_function_has_definition }, + { "flexible-array-sizeof", &Wflexible_array_sizeof }, { "implicit-int", &Wimplicit_int }, { "init-cstring", &Winit_cstring }, { "int-to-pointer-cast", &Wint_to_pointer_cast }, diff --git a/options.h b/options.h index abdf08645ad2..feb351a36c9e 100644 --- a/options.h +++ b/options.h @@ -99,6 +99,7 @@ extern int Wdesignated_init; extern int Wdo_while; extern int Wenum_mismatch; extern int Wexternal_function_has_definition; +extern int Wflexible_array_sizeof; extern int Wimplicit_int; extern int Winit_cstring; extern int Wint_to_pointer_cast; diff --git a/sparse.1 b/sparse.1 index 48dab7a9a5c1..5f98df33a231 100644 --- a/sparse.1 +++ b/sparse.1 @@ -257,6 +257,13 @@ Sparse issues these warnings by default. To turn them off, use \fB\-Wno\-external\-function\-has\-definition\fR. . .TP +.B -Wflexible-array-sizeof +Warn about using the sizeof operator on a structure containing a flexible array, +possibly recursively. + +Sparse does not issue these warnings by default. +. +.TP .B \-Winit\-cstring Warn about initialization of a char array with a too long constant C string. diff --git a/validation/flex-array-sizeof.c b/validation/flex-array-sizeof.c index 3359509d0084..05394e19a6b2 100644 --- a/validation/flex-array-sizeof.c +++ b/validation/flex-array-sizeof.c @@ -11,7 +11,6 @@ static int foo(struct s *s) /* * check-name: flex-array-sizeof * check-command: sparse -Wflexible-array-sizeof $file - * check-known-to-fail * * check-error-start flex-array-sizeof.c:8:16: warning: using sizeof on a flexible structure -- 2.28.0