]> granicus.if.org Git - clang/commit
[analyzer] Escape pointers stored into top-level parameters with destructors.
authorArtem Dergachev <artem.dergachev@gmail.com>
Sat, 13 Apr 2019 02:01:45 +0000 (02:01 +0000)
committerArtem Dergachev <artem.dergachev@gmail.com>
Sat, 13 Apr 2019 02:01:45 +0000 (02:01 +0000)
commitae2b0cf4c81fb2af5929f5193a2833cd95c740fb
treec9d0bbf923e3a1d6233eab7f3e4c696b19db2aad
parent31c307cf96ef1b6a4d0c542d18ebfd7a307ae9b0
[analyzer] Escape pointers stored into top-level parameters with destructors.

Writing stuff into an argument variable is usually equivalent to writing stuff
to a local variable: it will have no effect outside of the function.
There's an important exception from this rule: if the argument variable has
a non-trivial destructor, the destructor would be invoked on
the parent stack frame, exposing contents of the otherwise dead
argument variable to the caller.

If such argument is the last place where a pointer is stored before the function
exits and the function is the one we've started our analysis from (i.e., we have
no caller context for it), we currently diagnose a leak. This is incorrect
because the destructor of the argument still has access to the pointer.
The destructor may deallocate the pointer or even pass it further.

Treat writes into such argument regions as "escapes" instead, suppressing
spurious memory leak reports but not messing with dead symbol removal.

Differential Revision: https://reviews.llvm.org/D60112

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@358321 91177308-0d34-0410-b5e6-96231b3b80d8
lib/StaticAnalyzer/Core/ExprEngine.cpp
test/Analysis/malloc.cpp