aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-01-20 12:11:14 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-12-29 14:39:38 +0100
commit09fcd53fd30883985aa5aeacc24808ba02fb7be1 (patch)
tree93f7024dc86eae226d4a88b957f4033526ca1f0d
parenta565045f5e89b92d5f9c79b36fe60492d3e3119b (diff)
downloadsparse-09fcd53fd30883985aa5aeacc24808ba02fb7be1.tar.gz
struct-attr: fix: do not ignore struct/union/enum type attributes
GCC's syntax for type attributes is specified as: An attribute specifier list may appear as part of a struct, union or enum specifier. It may go either immediately after the struct, union or enum keyword, or after the closing brace. The former syntax is preferred. Where attribute specifiers follow the closing brace, they are considered to relate to the structure, union or enumerated type defined, not to any enclosing declaration the type specifier appears in, and the type defined is not complete until after the attribute specifiers. In the section about type attributes, it's also said: You may specify type attributes in an enum, struct or union type declaration or definition by placing them immediately after the struct, union or enum keyword. A less preferred syntax is to place them just past the closing curly brace of the definition. So, while placing the attribute after the closing curly is not preferred, it is cleary legal (and it seems to be much more popular than placing them just after the struct, union or enum keyword). However, currently sparse doesn't handle this correctly: - these attributes are parsed in declaration_specifiers() and added to the current decl_state - when the ';' ending the type declaration is reached, the plain struct/union/enum is used and the content of the decl_state is simply ignored. - if the declaration is for a variable, then those attributes are assigned to the variable (but not to the type). Fix this by calling handle_attribute() once we have reached the closing '}' of a struct/union/enum definition and applying these attributes, if any, directly to the current base type. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--parse.c2
-rw-r--r--validation/packed-bitfield3.c1
-rw-r--r--validation/packed-bitfield4.c1
-rw-r--r--validation/type-attribute-align.c1
-rw-r--r--validation/type-attribute-as.c1
-rw-r--r--validation/type-attribute-mod.c1
6 files changed, 2 insertions, 5 deletions
diff --git a/parse.c b/parse.c
index b38615b8..338e525f 100644
--- a/parse.c
+++ b/parse.c
@@ -764,6 +764,8 @@ static struct token *struct_union_enum_specifier(enum type type,
token = parse(token->next, sym);
token = expect(token, '}', "at end of specifier");
+ attr.ctype.base_type = sym;
+ token = handle_attributes(token, &attr);
apply_ctype(token->pos, &sym->ctype, &attr.ctype);
sym->endpos = token->pos;
diff --git a/validation/packed-bitfield3.c b/validation/packed-bitfield3.c
index c06e7c41..13368c84 100644
--- a/validation/packed-bitfield3.c
+++ b/validation/packed-bitfield3.c
@@ -25,5 +25,4 @@ _Static_assert( sizeof(struct c) == 8);
/*
* check-name: packed-bitfield3
- * check-known-to-fail
*/
diff --git a/validation/packed-bitfield4.c b/validation/packed-bitfield4.c
index 0342b241..1a956344 100644
--- a/validation/packed-bitfield4.c
+++ b/validation/packed-bitfield4.c
@@ -15,5 +15,4 @@ static int ld(struct s *s)
/*
* check-name: packed-bitfield4
* check-description: Is check_access() OK with short packed bitfields?
- * check-known-to-fail
*/
diff --git a/validation/type-attribute-align.c b/validation/type-attribute-align.c
index d9358bff..5f3db14a 100644
--- a/validation/type-attribute-align.c
+++ b/validation/type-attribute-align.c
@@ -16,5 +16,4 @@ void main(void)
/*
* check-name: type-attribute-align
- * check-known-to-fail
*/
diff --git a/validation/type-attribute-as.c b/validation/type-attribute-as.c
index b40b4e7d..38f06b37 100644
--- a/validation/type-attribute-as.c
+++ b/validation/type-attribute-as.c
@@ -21,7 +21,6 @@ void main(void)
/*
* check-name: type-attribute-as
- * check-known-to-fail
*
* check-error-start
type-attribute-as.c:16:15: warning: incorrect type in argument 1 (different address spaces)
diff --git a/validation/type-attribute-mod.c b/validation/type-attribute-mod.c
index 0e7b166a..d55011df 100644
--- a/validation/type-attribute-mod.c
+++ b/validation/type-attribute-mod.c
@@ -14,7 +14,6 @@ void main(void)
/*
* check-name: type-attribute-mod
- * check-known-to-fail
*
* check-error-start
type-attribute-mod.c:12:9: warning: dereference of noderef expression