Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- validation/flex-array-align.c | 19 +++++++++++++++++++ validation/flex-array-array.c | 16 ++++++++++++++++ validation/flex-array-error.c | 27 +++++++++++++++++++++++++++ validation/flex-array-nested.c | 30 ++++++++++++++++++++++++++++++ validation/flex-array-padding.c | 22 ++++++++++++++++++++++ validation/flex-array-sizeof.c | 19 +++++++++++++++++++ 6 files changed, 133 insertions(+) create mode 100644 validation/flex-array-align.c create mode 100644 validation/flex-array-array.c create mode 100644 validation/flex-array-error.c create mode 100644 validation/flex-array-nested.c create mode 100644 validation/flex-array-padding.c create mode 100644 validation/flex-array-sizeof.c diff --git a/validation/flex-array-align.c b/validation/flex-array-align.c new file mode 100644 index 000000000000..0cc67ab36997 --- /dev/null +++ b/validation/flex-array-align.c @@ -0,0 +1,19 @@ +struct s { + __INT32_TYPE__ x; + __INT16_TYPE__ y; + unsigned char f[]; +}; + +static int foo(struct s *s) +{ + return (sizeof(*s) << 16) | __builtin_offsetof(typeof(*s), f); +} + +/* + * check-name: flex-array-align + * check-command: test-linearize -Wno-flexible-array-sizeof $file + * check-known-to-fail + * + * check-output-ignore + * check-output-contains: ret\\..*\\$0x80006 + */ diff --git a/validation/flex-array-array.c b/validation/flex-array-array.c new file mode 100644 index 000000000000..bda80d7a0a20 --- /dev/null +++ b/validation/flex-array-array.c @@ -0,0 +1,16 @@ +struct s { + int i; + long f[]; +}; + +static struct s a[2]; + +/* + * check-name: flex-array-array + * check-command: sparse -Wflexible-array-array $file + * check-known-to-fail + * + * check-error-start +flex-array-array.c:6:18: warning: array of flexible structures + * check-error-end + */ diff --git a/validation/flex-array-error.c b/validation/flex-array-error.c new file mode 100644 index 000000000000..89601e42daf6 --- /dev/null +++ b/validation/flex-array-error.c @@ -0,0 +1,27 @@ +struct s { + int i; + long f[]; + int j; +}; + +union u { + int i; + long f[]; +}; + +// trigger the examination of the offending types +static int foo(struct s *s, union u *u) +{ + return __builtin_offsetof(typeof(*s), i) + + __builtin_offsetof(typeof(*u), i); +} + +/* + * check-name: flex-array-error + * check-known-to-fail + * + * check-error-start +flex-array-error.c:3:14: error: flexible array member 'f' is not last +flex-array-error.c:9:14: error: flexible array member 'f' in a union + * check-error-end + */ diff --git a/validation/flex-array-nested.c b/validation/flex-array-nested.c new file mode 100644 index 000000000000..3503c329d7c3 --- /dev/null +++ b/validation/flex-array-nested.c @@ -0,0 +1,30 @@ +struct f { + int i; + long f[]; +}; + +struct s { + struct f f; +}; + +union u { + struct f f; +}; + +// trigger the examination of the offending types +static int foo(struct s *s, union u *u) +{ + return __builtin_offsetof(typeof(*s), f) + + __builtin_offsetof(typeof(*u), f); +} + +/* + * 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 +flex-array-nested.c:10:7: warning: nested flexible arrays + * check-error-end + */ diff --git a/validation/flex-array-padding.c b/validation/flex-array-padding.c new file mode 100644 index 000000000000..2ba77971266e --- /dev/null +++ b/validation/flex-array-padding.c @@ -0,0 +1,22 @@ +struct s { + __INT32_TYPE__ x; + __INT16_TYPE__ y; + unsigned char f[]; +}; + +static int foo(struct s *s) +{ + return __builtin_offsetof(typeof(*s), f); +} + +/* + * check-name: flex-array-padding + * check-command: test-linearize -Wflexible-array-padding $file + * check-known-to-fail + * + * check-output-ignore + * + * check-error-start +flex-array-padding.c:4:23: warning: flexible array member has padding + * check-error-end + */ diff --git a/validation/flex-array-sizeof.c b/validation/flex-array-sizeof.c new file mode 100644 index 000000000000..3359509d0084 --- /dev/null +++ b/validation/flex-array-sizeof.c @@ -0,0 +1,19 @@ +struct s { + int i; + long f[]; +}; + +static int foo(struct s *s) +{ + return sizeof(*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 + * check-error-end + */ -- 2.28.0