Re: noreturn attribute doesn't work in smatch
John Levon <[email protected]>
| Newsgroups | org.kernel.vger.smatch |
|---|---|
| Message-ID | <[email protected]> |
I took another pass, and this works for me:
diff --git a/parse.c b/parse.c
index ca4726b8..44c59707 100644
--- a/parse.c
+++ b/parse.c
@@ -2859,6 +2859,7 @@ struct token *external_declaration(struct token
*token, struct symbol_list **lis
/* Parse declaration-specifiers, if any */
token = declaration_specifiers(token, &ctx);
mod = storage_modifiers(&ctx);
+ mod |= ctx.ctype.modifiers & MOD_NORETURN;
decl = alloc_symbol(token->pos, SYM_NODE);
/* Just a type declaration? */
if (match_op(token, ';')) {
(I suppose a proper fix would collate all function-level attributes
but...)
However, it seems like smatch is still not quite passing its knowledge
along: if I have:
extern void die() __attribute((__noreturn__));
void mydie()
{
die();
}
then the die() call is nullified, but smatch doesn't realise that means
all paths of mydie() are __noreturn__ too.
regards
john