]> granicus.if.org Git - clang/commit
[analyzer] Model casts to bool differently from other numbers.
authorJordan Rose <jordan_rose@apple.com>
Fri, 26 Apr 2013 21:42:55 +0000 (21:42 +0000)
committerJordan Rose <jordan_rose@apple.com>
Fri, 26 Apr 2013 21:42:55 +0000 (21:42 +0000)
commit5e6c06bc7deaaefe130b730032a9acb9cd38bf0c
tree8e421a4cae28be86511b2f22ec3e2e2986ee5177
parented6847ee6944757dfc4911abb29c6fc2d7cf9d79
[analyzer] Model casts to bool differently from other numbers.

Casts to bool (and _Bool) are equivalent to checks against zero,
not truncations to 1 bit or 8 bits.

This improved reasoning does cause a change in the behavior of the alpha
BoolAssignment checker. Previously, this checker complained about statements
like "bool x = y" if 'y' was known not to be 0 or 1. Now it does not, since
that conversion is well-defined. It's hard to say what the "best" behavior
here is: this conversion is safe, but might be better written as an explicit
comparison against zero.

More usefully, besides improving our model of booleans, this fixes spurious
warnings when returning the address of a local variable cast to bool.

<rdar://problem/13296133>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@180638 91177308-0d34-0410-b5e6-96231b3b80d8
lib/StaticAnalyzer/Core/SValBuilder.cpp
test/Analysis/bool-assignment.c
test/Analysis/casts.c
test/Analysis/stack-addr-ps.cpp
test/Analysis/stackaddrleak.c