Skip to content

Commit

Permalink
Reapply [analyzer] Simplify SVal for simple NonLoc->Loc casts
Browse files Browse the repository at this point in the history
Reapply after fixing the test by enabling the `debug.ExprInspection` checker.

-----

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
  • Loading branch information
danix800 authored and steakhal committed Sep 15, 2023
1 parent b0f0aa8 commit 7c9abbd
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
3 changes: 2 additions & 1 deletion clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,8 @@ ProgramStateRef ExprEngine::handleLValueBitCast(
}
// Delegate to SValBuilder to process.
SVal OrigV = state->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're treating the boolean as a signed i1
if (CastE->getCastKind() == CK_BooleanToSignedIntegral && V.isValid())
V = svalBuilder.evalMinus(V.castAs<NonLoc>());
Expand Down
28 changes: 27 additions & 1 deletion clang/test/Analysis/symbol-simplification-nonloc-loc.cpp
Original file line number Diff line number Diff line change
@@ -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 <typename BinOp>
Expand Down Expand Up @@ -73,3 +75,27 @@ void zoo1backwards() {
*(0 + p) = nullptr; // warn
**(0 + p) = 'a'; // 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}}
}
}

0 comments on commit 7c9abbd

Please sign in to comment.