noreturn attribute doesn't work in smatch
John Levon <[email protected]>
| Newsgroups | org.kernel.vger.smatch |
|---|---|
| Message-ID | <[email protected]> |
./smatch: a.c:20 main() error: double free of 'str'
given:
```
#include <stdlib.h>
#include <string.h>
__attribute__((__noreturn__)) void
die(void)
{
exit(1);
}
int
main(void)
{
char *str = strdup("test");
if (str != NULL) {
free(str);
die();
}
free(str);
return (0);
}
```
As far as I can figure out, this looks like a sparse problem: an
'inline' or 'extern' specifier in this position gets marked as the
relevant MOD_* flag for the function, but the noreturn doesn't bubble
up in the same way. Some quick lame attempts to add ctx->is_noreturn did
not go well.
I think this might be the underlying issue behind sparse's failing test
validation/function-redecl2.c but I'm not positive.
We can do:
```
#ifdef __CHECKER__
#define SMATCH_NORETURN __attribute__((__noreturn__))
#else
#define SMATCH_NORETURN /* would break gcc otherwise */
#endif
__attribute__((__noreturn__)) void
die(void) SMATCH_NORETURN
{
```
but it's ... unlovely.
Any thoughts?
thanks
john