Skip to contentSkip to conversation

dissect: enforce toplevel() if SYM_STRUCT was not defined

PATCH In review Oleg Nesterov 2 participants 2 messages Feb 27, 2020 – Mar 2, 2020 Sparse checker

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 dissect: enforce toplevel() if SYM_STRUCT was not defined

A separate change for documentation purposes.

Test-case:

	void func(void)
	{
		struct UNDEFINED x;
		x.member = 0;
	}

output:

   1:6                    def   f func                             void ( ... )
   3:26  func             def . v x                                struct UNDEFINED
   4:9   func             -w- . v x                                struct UNDEFINED
   4:10  func             -w- . m UNDEFINED.member                 bad type

but in this case is_sym_local(UNDEFINED) = F makes more sense, most probably this struct was defined somewhere else but __sparse() didn't see its definition.

Change lookup_member() to set type->scope = file_scope if !symbol_list. This is not 100% correct, but struct_union_enum_specifier() does the same check with the following comment:

	// The following test is actually wrong for empty
	// structs, but (1) they are not C99, (2) gcc does
	// the same thing, and (3) it's easier.
---
 dissect.c | 3 +++
 1 file changed, 3 insertions(+)
dissect.c +3 -0
index c48214b9..1970e46f 100644
@@ -304,6 +304,9 @@ static struct symbol *lookup_member(struct symbol *type, struct ident *name, int
 			.kind = 'm',
 		};
 
+		if (!type->symbol_list)
+			type->scope = file_scope;
+
 		mem = &bad_member;
 		mem->ident = name;
 	}
Signature · 1 line
2.25.1.362.g51ebf55
#1 lore raw
Quoted 1 line · Oleg Nesterov

A separate change for documentation purposes.

Thanks.
Applied & pushed.

-- Luc