martong updated this revision to Diff 429633. martong marked 2 inline comments as done. martong added a comment.
- Use existing fromUnOp - pass nullptr as FromTy Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125547/new/ https://reviews.llvm.org/D125547 Files: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h clang/test/Analysis/z3-crosscheck.c Index: clang/test/Analysis/z3-crosscheck.c =================================================================== --- clang/test/Analysis/z3-crosscheck.c +++ clang/test/Analysis/z3-crosscheck.c @@ -14,6 +14,20 @@ return 0; } +int unary(int x, long l) +{ + int *z = 0; + int y = l; + if ((x & 1) && ((x & 1) ^ 1)) + if (-y) +#ifdef NO_CROSSCHECK + return *z; // expected-warning {{Dereference of null pointer (loaded from variable 'z')}} +#else + return *z; // no-warning +#endif + return 0; +} + void g(int d); void f(int *a, int *b) { Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h @@ -446,6 +446,14 @@ return getCastExpr(Solver, Ctx, Exp, FromTy, Sym->getType()); } + if (const UnarySymExpr *USE = dyn_cast<UnarySymExpr>(Sym)) { + if (RetTy) + *RetTy = Sym->getType(); + llvm::SMTExprRef Exp = + getSymExpr(Solver, Ctx, USE->getOperand(), nullptr, hasComparison); + return fromUnOp(Solver, USE->getOpcode(), Exp); + } + if (const BinarySymExpr *BSE = dyn_cast<BinarySymExpr>(Sym)) { llvm::SMTExprRef Exp = getSymBinExpr(Solver, Ctx, BSE, hasComparison, RetTy);
Index: clang/test/Analysis/z3-crosscheck.c =================================================================== --- clang/test/Analysis/z3-crosscheck.c +++ clang/test/Analysis/z3-crosscheck.c @@ -14,6 +14,20 @@ return 0; } +int unary(int x, long l) +{ + int *z = 0; + int y = l; + if ((x & 1) && ((x & 1) ^ 1)) + if (-y) +#ifdef NO_CROSSCHECK + return *z; // expected-warning {{Dereference of null pointer (loaded from variable 'z')}} +#else + return *z; // no-warning +#endif + return 0; +} + void g(int d); void f(int *a, int *b) { Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h @@ -446,6 +446,14 @@ return getCastExpr(Solver, Ctx, Exp, FromTy, Sym->getType()); } + if (const UnarySymExpr *USE = dyn_cast<UnarySymExpr>(Sym)) { + if (RetTy) + *RetTy = Sym->getType(); + llvm::SMTExprRef Exp = + getSymExpr(Solver, Ctx, USE->getOperand(), nullptr, hasComparison); + return fromUnOp(Solver, USE->getOpcode(), Exp); + } + if (const BinarySymExpr *BSE = dyn_cast<BinarySymExpr>(Sym)) { llvm::SMTExprRef Exp = getSymBinExpr(Solver, Ctx, BSE, hasComparison, RetTy);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits