llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-static-analyzer-1 <details> <summary>Changes</summary> NonLoc symbolic SVal to Loc casts are not supported except for nonloc::ConcreteInt. This change simplifies the source SVals so that the more casts can go through nonloc::ConcreteInt->loc::ConcreteInt path. For example: void test_simplified_before_cast_add(long long t1) { long long t2 = t1 + 3; if (!t2) { int *p = (int *) t2; clang_analyzer_eval(p == 0); // expected-warning{{TRUE}} } } If simplified, 't2' is 0, resulting 'p' is nullptr, otherwise 'p' is unknown. Fixes #62232 -- Full diff: https://github.com/llvm/llvm-project/pull/66498.diff 2 Files Affected: - (modified) clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp (+2-1) - (modified) clang/test/Analysis/symbol-simplification-nonloc-loc.cpp (+27-1) <pre> diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp index 2a47116db55a1ad..7e431f7e598c4cb 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp @@ -264,7 +264,8 @@ ProgramStateRef ExprEngine::handleLValueBitCast( } // Delegate to SValBuilder to process. SVal OrigV = state-&gt;getSVal(Ex, LCtx); - SVal V = svalBuilder.evalCast(OrigV, T, ExTy); + SVal SimplifiedOrigV = svalBuilder.simplifySVal(state, OrigV); + SVal V = svalBuilder.evalCast(SimplifiedOrigV, T, ExTy); // Negate the result if we&#x27;re treating the boolean as a signed i1 if (CastE-&gt;getCastKind() == CK_BooleanToSignedIntegral &amp;&amp; V.isValid()) V = svalBuilder.evalMinus(V.castAs&lt;NonLoc&gt;()); diff --git a/clang/test/Analysis/symbol-simplification-nonloc-loc.cpp b/clang/test/Analysis/symbol-simplification-nonloc-loc.cpp index 485f68d9a5acfba..6cfe8da971429c3 100644 --- a/clang/test/Analysis/symbol-simplification-nonloc-loc.cpp +++ b/clang/test/Analysis/symbol-simplification-nonloc-loc.cpp @@ -1,6 +1,8 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core %s \ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection %s \ // RUN: -triple x86_64-pc-linux-gnu -verify +void clang_analyzer_eval(int); + #define BINOP(OP) [](auto x, auto y) { return x OP y; } template &lt;typename BinOp&gt; @@ -73,3 +75,27 @@ void zoo1backwards() { *(0 + p) = nullptr; // warn **(0 + p) = &#x27;a&#x27;; // no-warning: this should be unreachable } + +void test_simplified_before_cast_add(long t1) { + long t2 = t1 + 3; + if (!t2) { + int *p = (int *) t2; + clang_analyzer_eval(p == 0); // expected-warning{{TRUE}} + } +} + +void test_simplified_before_cast_sub(long t1) { + long t2 = t1 - 3; + if (!t2) { + int *p = (int *) t2; + clang_analyzer_eval(p == 0); // expected-warning{{TRUE}} + } +} + +void test_simplified_before_cast_mul(long t1) { + long t2 = t1 * 3; + if (!t2) { + int *p = (int *) t2; + clang_analyzer_eval(p == 0); // expected-warning{{TRUE}} + } +} </pre> </details> https://github.com/llvm/llvm-project/pull/66498 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits