]> granicus.if.org Git - clang/commit
[analyzer] If a lazy binding is undefined, pretend that it's unknown instead.
authorJordan Rose <jordan_rose@apple.com>
Thu, 31 Jan 2013 02:57:06 +0000 (02:57 +0000)
committerJordan Rose <jordan_rose@apple.com>
Thu, 31 Jan 2013 02:57:06 +0000 (02:57 +0000)
commit0e450cbd94e5936fdecf42b810069e7becd3938d
treeddc63287fa422193a46c3ec759a8b027304bdd18
parentf499b34d4911dda3b20ede1377ea29b83d3f149e
[analyzer] If a lazy binding is undefined, pretend that it's unknown instead.

This is a hack to work around the fact that we don't track extents for our
default bindings:

  CGPoint p;
  p.x = 0.0;
  p.y = 0.0;
  rectParam.origin = p;
  use(rectParam.size); // warning: uninitialized value in rectParam.size.width

In this case, the default binding for 'p' gets copied into 'rectParam',
because the 'origin' field is at offset 0 within CGRect. From then on,
rectParam's old default binding (in this case a symbol) is lost.

This patch silences the warning by pretending that lazy bindings are never
made from uninitialized memory, but not only is that not true, the original
default binding is still getting overwritten (see FIXME test cases).
The long-term solution is tracked in <rdar://problem/12701038>

PR14765 and <rdar://problem/12875012>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174031 91177308-0d34-0410-b5e6-96231b3b80d8
lib/StaticAnalyzer/Core/RegionStore.cpp
test/Analysis/uninit-vals.m