alexshap created this revision. Herald added a subscriber: xazax.hun. This diff attempts to fix modeling of arithmetic expressions where pointers are treated as integers (i.e. via C-style / reinterpret casts). In particular, it resolves https://bugs.llvm.org/show_bug.cgi?id=34309
Test plan: make check-all Repository: rL LLVM https://reviews.llvm.org/D37120 Files: lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp test/Analysis/ptr-arith.cpp Index: test/Analysis/ptr-arith.cpp =================================================================== --- test/Analysis/ptr-arith.cpp +++ test/Analysis/ptr-arith.cpp @@ -105,3 +105,9 @@ return 0; return N; } + +// Bug 34309 +bool ptrAsIntegerSubtractionNoCrash(long x, char *p) { + long y = (long)p - 1; + return y == x; +} Index: lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp =================================================================== --- lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -364,6 +364,13 @@ rhs.castAs<nonloc::LocAsInteger>().getLoc(), resultTy); case nonloc::ConcreteIntKind: { + // Evaluate pointers treated as integers + // (for example, results of C-style casts (long)((void *)ptr)) + // in arithmetic expressions with integers. + if (!BinaryOperator::isComparisonOp(op)) + return makeSymExprValNN( + state, op, lhs.castAs<nonloc::LocAsInteger>(), + rhs.castAs<nonloc::ConcreteInt>(), resultTy); // Transform the integer into a location and compare. // FIXME: This only makes sense for comparisons. If we want to, say, // add 1 to a LocAsInteger, we'd better unpack the Loc and add to it,
Index: test/Analysis/ptr-arith.cpp =================================================================== --- test/Analysis/ptr-arith.cpp +++ test/Analysis/ptr-arith.cpp @@ -105,3 +105,9 @@ return 0; return N; } + +// Bug 34309 +bool ptrAsIntegerSubtractionNoCrash(long x, char *p) { + long y = (long)p - 1; + return y == x; +} Index: lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp =================================================================== --- lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -364,6 +364,13 @@ rhs.castAs<nonloc::LocAsInteger>().getLoc(), resultTy); case nonloc::ConcreteIntKind: { + // Evaluate pointers treated as integers + // (for example, results of C-style casts (long)((void *)ptr)) + // in arithmetic expressions with integers. + if (!BinaryOperator::isComparisonOp(op)) + return makeSymExprValNN( + state, op, lhs.castAs<nonloc::LocAsInteger>(), + rhs.castAs<nonloc::ConcreteInt>(), resultTy); // Transform the integer into a location and compare. // FIXME: This only makes sense for comparisons. If we want to, say, // add 1 to a LocAsInteger, we'd better unpack the Loc and add to it,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits