[Analyzer] More accurate modeling about the increment operator of the operand with...
authorHenry Wong <movietravelcode@outlook.com>
Tue, 6 Mar 2018 12:29:09 +0000 (12:29 +0000)
committerHenry Wong <movietravelcode@outlook.com>
Tue, 6 Mar 2018 12:29:09 +0000 (12:29 +0000)
commite47b89d1f866ae78034026c6477638dbcd48f025
treeeb998f12bd3a989996925f44263a0de66e31291a
parent5e5dd7067490cd98549a2015b7a521c862e68fd6
[Analyzer] More accurate modeling about the increment operator of the operand with type bool.

Summary:
There is a problem with analyzer that a wrong value is given when modeling the increment operator of the operand with type bool. After `rL307604` is applied, a unsigned overflow may occur.

Example:
```
void func() {
  bool b = true;
  // unsigned overflow occur, 2 -> 0 U1b
  b++;
}
```

The use of an operand of type bool with the ++ operators is deprecated but valid untill C++17. And if the operand of the increment operator is of type bool, it is set to true.

This patch includes two parts:

  - If the operand of the increment operator is of type bool or type _Bool, set to true.
  - Modify `BasicValueFactory::getTruthValue()`, use `getIntWidth()` instead `getTypeSize()` and use `unsigned` instead `signed`.

Reviewers: alexshap, NoQ, dcoughlin, george.karpenkov

Reviewed By: NoQ

Subscribers: xazax.hun, szepet, a.sidorin, cfe-commits, MTC

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

llvm-svn: 326776
clang/include/clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h
clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp
clang/test/Analysis/_Bool-increment-decrement.c [new file with mode: 0644]
clang/test/Analysis/bool-increment.cpp [new file with mode: 0644]