A structure or a union containing another aggregate type containing, possibly recursively, a flexible array is quite error prone and make not much sense. So, add an option -Wflexible-array-nested to warn on such usage. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- options.c | 2 ++ options.h | 1 + sparse.1 | 7 +++++++ symbol.c | 4 ++++ validation/flex-array-nested.c | 1 - 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/options.c b/options.c index a8129ac1e952..b46900b973a6 100644 --- a/options.c +++ b/options.c @@ -101,6 +101,7 @@ int Wdo_while = 0; int Wenum_mismatch = 1; int Wexternal_function_has_definition = 1; int Wflexible_array_array = 1; +int Wflexible_array_nested = 0; int Wflexible_array_sizeof = 0; int Wimplicit_int = 1; int Winit_cstring = 0; @@ -843,6 +844,7 @@ static const struct flag warnings[] = { { "enum-mismatch", &Wenum_mismatch }, { "external-function-has-definition", &Wexternal_function_has_definition }, { "flexible-array-array", &Wflexible_array_array }, + { "flexible-array-nested", &Wflexible_array_nested }, { "flexible-array-sizeof", &Wflexible_array_sizeof }, { "implicit-int", &Wimplicit_int }, { "init-cstring", &Winit_cstring }, diff --git a/options.h b/options.h index 7bcf925b6912..d23ed472eaac 100644 --- a/options.h +++ b/options.h @@ -100,6 +100,7 @@ extern int Wdo_while; extern int Wenum_mismatch; extern int Wexternal_function_has_definition; extern int Wflexible_array_array; +extern int Wflexible_array_nested; extern int Wflexible_array_sizeof; extern int Wimplicit_int; extern int Winit_cstring; diff --git a/sparse.1 b/sparse.1 index c1a74153c618..9b1a59c6b9d4 100644 --- a/sparse.1 +++ b/sparse.1 @@ -264,6 +264,13 @@ Sparse issues these warnings by default. To turn them off, use \fB-Wno-flexible-array-array\fR. . .TP +.B -Wflexible-array-nested +Warn about structures containing a flexible array being contained into +another structure, union or array. + +Sparse does not issue these warnings by default. +. +.TP .B -Wflexible-array-sizeof Warn about using the sizeof operator on a structure containing a flexible array, possibly recursively. diff --git a/symbol.c b/symbol.c index 02b9066e966a..a9f646eb053f 100644 --- a/symbol.c +++ b/symbol.c @@ -197,6 +197,10 @@ static struct symbol * examine_struct_union_type(struct symbol *sym, int advance info.max_align = member->ctype.alignment; } + if (has_flexible_array(member)) + info.has_flex_array = 1; + if (has_flexible_array(member) && Wflexible_array_nested) + warning(sym->pos, "nested flexible arrays"); fn(member, &info); } END_FOR_EACH_PTR(member); diff --git a/validation/flex-array-nested.c b/validation/flex-array-nested.c index 3503c329d7c3..63767683c56a 100644 --- a/validation/flex-array-nested.c +++ b/validation/flex-array-nested.c @@ -21,7 +21,6 @@ static int foo(struct s *s, union u *u) /* * check-name: flex-array-nested * check-command: sparse -Wflexible-array-nested $file - * check-known-to-fail * * check-error-start flex-array-nested.c:6:8: warning: nested flexible arrays -- 2.28.0