diff options
| author | Gabor Horvath <xazax.hun@gmail.com> | 2017-05-12 07:02:54 +0000 |
|---|---|---|
| committer | Gabor Horvath <xazax.hun@gmail.com> | 2017-05-12 07:02:54 +0000 |
| commit | 3a00b41e43cdff4544340da0ea40408e99246982 (patch) | |
| tree | c91453de6a9c22dd604619cd3fa638fc54d84d12 /clang/lib/StaticAnalyzer | |
| parent | 9543a4b681645f9a56e213dfc80ff38196e1f45a (diff) | |
| download | bcm5719-llvm-3a00b41e43cdff4544340da0ea40408e99246982.tar.gz bcm5719-llvm-3a00b41e43cdff4544340da0ea40408e99246982.zip | |
[analyzer] Add modelling of __builtin_assume
Differential Revision: https://reviews.llvm.org/D33092
llvm-svn: 302880
Diffstat (limited to 'clang/lib/StaticAnalyzer')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp index 8c2aef21b3c..48d6cd8a527 100644 --- a/clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp @@ -41,6 +41,22 @@ bool BuiltinFunctionChecker::evalCall(const CallExpr *CE, default: return false; + case Builtin::BI__builtin_assume: { + assert (CE->arg_begin() != CE->arg_end()); + SVal ArgSVal = state->getSVal(CE->getArg(0), LCtx); + if (ArgSVal.isUndef()) + return true; // Return true to model purity. + + state = state->assume(ArgSVal.castAs<DefinedOrUnknownSVal>(), true); + // FIXME: do we want to warn here? Not right now. The most reports might + // come from infeasible paths, thus being false positives. + if (!state) + return true; + + C.addTransition(state); + return true; + } + case Builtin::BI__builtin_unpredictable: case Builtin::BI__builtin_expect: case Builtin::BI__builtin_assume_aligned: |

