diff options
author | Anna Zaks <ganna@apple.com> | 2013-01-19 02:18:15 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-01-19 02:18:15 +0000 |
commit | 1dfebd9f995066a229c34516eb14bc69c6bcde2c (patch) | |
tree | 8440cd3c2a633129cce870843c4b9a63baa5b314 /test | |
parent | f30527901f84c9bf223db143b216a9061ee9e342 (diff) |
[analyzer] Suppress warnings coming out of macros defined in sys/queue.h
Suppress the warning by just not emitting the report. The sink node
would get generated, which is fine since we did reach a bad state.
Motivation
Due to the way code is structured in some of these macros, we do not
reason correctly about it and report false positives. Specifically, the
following loop reports a use-after-free. Because of the way the code is
structured inside of the macro, the analyzer assumes that the list can
have cycles, so you end up with use-after-free in the loop, that is
safely deleting elements of the list. (The user does not have a way to
teach the analyzer about shape of data structures.)
SLIST_FOREACH_SAFE(item, &ctx->example_list, example_le, tmpitem) {
if (item->index == 3) { // if you remove each time, no complaints
assert((&ctx->example_list)->slh_first == item);
SLIST_REMOVE(&ctx->example_list, item, example_s, example_le);
free(item);
}
}
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172883 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/Analysis/diagnostics/false-positive-suppression.c | 23 | ||||
-rw-r--r-- | test/Analysis/diagnostics/include/sys/queue.h | 5 |
2 files changed, 28 insertions, 0 deletions
diff --git a/test/Analysis/diagnostics/false-positive-suppression.c b/test/Analysis/diagnostics/false-positive-suppression.c new file mode 100644 index 0000000000..420a573380 --- /dev/null +++ b/test/Analysis/diagnostics/false-positive-suppression.c @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix -verify %s +// expected-no-diagnostics + +#include "include/sys/queue.h" + +typedef __typeof(sizeof(int)) size_t; +void *malloc(size_t); + +int radar12491259() { + int *p = malloc(12); + FREE_POINTER(p); + FREE_POINTER(p); // no-warning: we are suppressing errors coming from sys/queue macros. + return 0; +} + +#define MYMACRO(p) FREE_POINTER(p) + +int radar12491259_inside_macro() { + int *p = malloc(12); + MYMACRO(p); + MYMACRO(p); // no-warning: we are suppressing errors coming from sys/queue macros. + return 0; +} diff --git a/test/Analysis/diagnostics/include/sys/queue.h b/test/Analysis/diagnostics/include/sys/queue.h new file mode 100644 index 0000000000..e5698ed443 --- /dev/null +++ b/test/Analysis/diagnostics/include/sys/queue.h @@ -0,0 +1,5 @@ +#pragma clang system_header + +void free(void *); +#define FREE_POINTER(x) free(x) + |