Author: Gabor Marton Date: 2021-11-22T17:33:43+01:00 New Revision: ffc32efd1cd6a34659e2c559e9ba6ee923b1637a
URL: https://github.com/llvm/llvm-project/commit/ffc32efd1cd6a34659e2c559e9ba6ee923b1637a DIFF: https://github.com/llvm/llvm-project/commit/ffc32efd1cd6a34659e2c559e9ba6ee923b1637a.diff LOG: [Analyzer][Core] Simplify IntSym in SValBuilder Make the SimpleSValBuilder capable to simplify existing IntSym expressions based on a newly added constraint on the sub-expression. Differential Revision: https://reviews.llvm.org/D113754 Added: clang/test/Analysis/svalbuilder-simplify-intsym.cpp Modified: clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp index 681a1f64eadc..54a2386fc2ff 100644 --- a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -1183,6 +1183,19 @@ SVal SimpleSValBuilder::simplifySVal(ProgramStateRef State, SVal V) { S, SVB.evalBinOp(State, S->getOpcode(), LHS, RHS, S->getType())); } + SVal VisitIntSymExpr(const IntSymExpr *S) { + auto I = Cached.find(S); + if (I != Cached.end()) + return I->second; + + SVal RHS = Visit(S->getRHS()); + if (isUnchanged(S->getRHS(), RHS)) + return skip(S); + SVal LHS = SVB.makeIntVal(S->getLHS()); + return cache( + S, SVB.evalBinOp(State, S->getOpcode(), LHS, RHS, S->getType())); + } + SVal VisitSymSymExpr(const SymSymExpr *S) { auto I = Cached.find(S); if (I != Cached.end()) diff --git a/clang/test/Analysis/svalbuilder-simplify-intsym.cpp b/clang/test/Analysis/svalbuilder-simplify-intsym.cpp new file mode 100644 index 000000000000..8a58b797c86e --- /dev/null +++ b/clang/test/Analysis/svalbuilder-simplify-intsym.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_analyze_cc1 %s \ +// RUN: -analyzer-checker=core \ +// RUN: -analyzer-checker=debug.ExprInspection \ +// RUN: -analyzer-config eagerly-assume=false \ +// RUN: -verify + +// Here we test whether the SValBuilder is capable to simplify existing +// IntSym expressions based on a newly added constraint on the sub-expression. + +void clang_analyzer_eval(bool); + +void test_SValBuilder_simplifies_IntSym(int x, int y) { + // Most IntSym BinOps are transformed to SymInt in SimpleSValBuilder. + // Division is one exception. + x = 77 / y; + if (y != 1) + return; + clang_analyzer_eval(x == 77); // expected-warning{{TRUE}} + (void)(x * y); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits