]> granicus.if.org Git - clang/commit
[analyzer] Make default bindings to variables actually work.
authorArtem Dergachev <artem.dergachev@gmail.com>
Thu, 18 Apr 2019 23:35:56 +0000 (23:35 +0000)
committerArtem Dergachev <artem.dergachev@gmail.com>
Thu, 18 Apr 2019 23:35:56 +0000 (23:35 +0000)
commit9fd8114715ec9e38d3393e72af0a25d55d5a24d7
tree696fc8ef3d36b63a12801549a92381797bf08255
parentf9275e59d1d1c8ec7b0fd54994d481bfffa7cc47
[analyzer] Make default bindings to variables actually work.

Default RegionStore bindings represent values that can be obtained by loading
from anywhere within the region, not just the specific offset within the region
that they are said to be bound to. For example, default-binding a character \0
to an int (eg., via memset()) means that the whole int is 0, not just
that its lower byte is 0.

Even though memset and bzero were modeled this way, it didn't work correctly
when applied to simple variables. Eg., in

  int x;
  memset(x, 0, sizeof(x));

we did produce a default binding, but were unable to read it later, and 'x'
was perceived as an uninitialized variable even after memset.

At the same time, if we replace 'x' with a variable of a structure or array
type, accessing fields or elements of such variable was working correctly,
which was enough for most cases. So this was only a problem for variables of
simple integer/enumeration/floating-point/pointer types.

Fix loading default bindings from RegionStore for regions of simple variables.

Add a unit test to document the API contract as well.

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@358722 91177308-0d34-0410-b5e6-96231b3b80d8
lib/StaticAnalyzer/Core/RegionStore.cpp
test/Analysis/string.c
unittests/StaticAnalyzer/CMakeLists.txt
unittests/StaticAnalyzer/StoreTest.cpp [new file with mode: 0644]