From 97a654c5cc317fc78d32ef9db638c33139ba9997 Mon Sep 17 00:00:00 2001 From: Anton Yartsev Date: Wed, 4 Mar 2015 23:18:21 +0000 Subject: [PATCH] [analyzer] Bug fix: do not report leaks for alloca() git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231314 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 5 +++++ test/Analysis/malloc.c | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index d77af6a4fb..f2afcca971 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -1934,6 +1934,11 @@ void MallocChecker::reportLeak(SymbolRef Sym, ExplodedNode *N, if (!CheckKind.hasValue()) return; + const RefState *RS = C.getState()->get(Sym); + assert(RS); + if (RS->getAllocationFamily() == AF_Alloca) + return; + assert(N); if (!BT_Leak[*CheckKind]) { BT_Leak[*CheckKind].reset( diff --git a/test/Analysis/malloc.c b/test/Analysis/malloc.c index 9c08bbcb1c..5762061ba1 100644 --- a/test/Analysis/malloc.c +++ b/test/Analysis/malloc.c @@ -6,6 +6,7 @@ void clang_analyzer_eval(int); typedef __typeof(sizeof(int)) size_t; void *malloc(size_t); +void *alloca(size_t); void *valloc(size_t); void free(void *); void *realloc(void *ptr, size_t size); @@ -50,6 +51,14 @@ void reallocNotNullPtr(unsigned sizeIn) { } } +void allocaTest() { + int *p = alloca(sizeof(int)); +} // no warn + +void allocaBuiltinTest() { + int *p = __builtin_alloca(sizeof(int)); +} // no warn + int *realloctest1() { int *q = malloc(12); q = realloc(q, 20); -- 2.40.0