Re: [PATCH] D14652: [analyzer] Improve modeling of static initializers.
ygribov added inline comments. Comment at: test/Analysis/inline.cpp:308 @@ +307,3 @@ +clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} +clang_analyzer_eval(0 != ((char *)void_string)[1]); // expected-warning{{TRUE}} + } zaks.anna wrote: > ygribov wrote: > > zaks.anna wrote: > > > Why are we checking that the first element is not '0'? > > We could check s[0] as well, there is no difference actually. > Why we are checking for non-equality to '0' instead of checking for equality > to 'b'? Ah yeah, that would be more precise. Repository: rL LLVM http://reviews.llvm.org/D14652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D14652: [analyzer] Improve modeling of static initializers.
zaks.anna added a comment. Fixed and committed. Comment at: test/Analysis/inline.cpp:308 @@ +307,3 @@ +clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} +clang_analyzer_eval(0 != ((char *)void_string)[1]); // expected-warning{{TRUE}} + } ygribov wrote: > zaks.anna wrote: > > Why are we checking that the first element is not '0'? > We could check s[0] as well, there is no difference actually. Why we are checking for non-equality to '0' instead of checking for equality to 'b'? Repository: rL LLVM http://reviews.llvm.org/D14652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D14652: [analyzer] Improve modeling of static initializers.
This revision was automatically updated to reflect the committed changes. Closed by commit rL253532: [analyzer] Improve modeling of static initializers. (authored by zaks). Changed prior to commit: http://reviews.llvm.org/D14652?vs=40144&id=40582#toc Repository: rL LLVM http://reviews.llvm.org/D14652 Files: cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp cfe/trunk/test/Analysis/inline.cpp Index: cfe/trunk/test/Analysis/inline.cpp === --- cfe/trunk/test/Analysis/inline.cpp +++ cfe/trunk/test/Analysis/inline.cpp @@ -275,7 +275,7 @@ clang_analyzer_eval(defaultReferenceZero(1) == -1); // expected-warning{{TRUE}} clang_analyzer_eval(defaultReferenceZero() == 0); // expected-warning{{TRUE}} -} + } double defaultFloatReference(const double &i = 42) { return -i; @@ -300,6 +300,13 @@ clang_analyzer_eval(defaultString("xyz") == 'y'); // expected-warning{{TRUE}} clang_analyzer_eval(defaultString() == 'b'); // expected-warning{{TRUE}} } + + const void * const void_string = "abc"; + + void testBitcastedString() { +clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} +clang_analyzer_eval('b' == ((char *)void_string)[1]); // expected-warning{{TRUE}} + } } namespace OperatorNew { Index: cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp === --- cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -275,11 +275,17 @@ case Stmt::ImplicitCastExprClass: { const CastExpr *CE = cast(E); -if (CE->getCastKind() == CK_ArrayToPointerDecay) { - Optional ArrayVal = getConstantVal(CE->getSubExpr()); - if (!ArrayVal) +switch (CE->getCastKind()) { +default: + break; +case CK_ArrayToPointerDecay: +case CK_BitCast: { + const Expr *SE = CE->getSubExpr(); + Optional Val = getConstantVal(SE); + if (!Val) return None; - return evalCast(*ArrayVal, CE->getType(), CE->getSubExpr()->getType()); + return evalCast(*Val, CE->getType(), SE->getType()); +} } // FALLTHROUGH } Index: cfe/trunk/test/Analysis/inline.cpp === --- cfe/trunk/test/Analysis/inline.cpp +++ cfe/trunk/test/Analysis/inline.cpp @@ -275,7 +275,7 @@ clang_analyzer_eval(defaultReferenceZero(1) == -1); // expected-warning{{TRUE}} clang_analyzer_eval(defaultReferenceZero() == 0); // expected-warning{{TRUE}} -} + } double defaultFloatReference(const double &i = 42) { return -i; @@ -300,6 +300,13 @@ clang_analyzer_eval(defaultString("xyz") == 'y'); // expected-warning{{TRUE}} clang_analyzer_eval(defaultString() == 'b'); // expected-warning{{TRUE}} } + + const void * const void_string = "abc"; + + void testBitcastedString() { +clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} +clang_analyzer_eval('b' == ((char *)void_string)[1]); // expected-warning{{TRUE}} + } } namespace OperatorNew { Index: cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp === --- cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -275,11 +275,17 @@ case Stmt::ImplicitCastExprClass: { const CastExpr *CE = cast(E); -if (CE->getCastKind() == CK_ArrayToPointerDecay) { - Optional ArrayVal = getConstantVal(CE->getSubExpr()); - if (!ArrayVal) +switch (CE->getCastKind()) { +default: + break; +case CK_ArrayToPointerDecay: +case CK_BitCast: { + const Expr *SE = CE->getSubExpr(); + Optional Val = getConstantVal(SE); + if (!Val) return None; - return evalCast(*ArrayVal, CE->getType(), CE->getSubExpr()->getType()); + return evalCast(*Val, CE->getType(), SE->getType()); +} } // FALLTHROUGH } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D14652: [analyzer] Improve modeling of static initializers.
ygribov added inline comments. Comment at: test/Analysis/inline.cpp:308 @@ +307,3 @@ +clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} +clang_analyzer_eval(0 != ((char *)void_string)[1]); // expected-warning{{TRUE}} + } zaks.anna wrote: > Why are we checking that the first element is not '0'? We could check s[0] as well, there is no difference actually. http://reviews.llvm.org/D14652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D14652: [analyzer] Improve modeling of static initializers.
zaks.anna added inline comments. Comment at: test/Analysis/inline.cpp:308 @@ +307,3 @@ +clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} +clang_analyzer_eval(0 != ((char *)void_string)[1]); // expected-warning{{TRUE}} + } Why are we checking that the first element is not '0'? http://reviews.llvm.org/D14652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D14652: [analyzer] Improve modeling of static initializers.
ygribov created this revision. ygribov added reviewers: zaks.anna, dcoughlin, jordan_rose. ygribov added a subscriber: cfe-commits. Conversions between unrelated pointer types (e.g. char * and void *) involve bitcasts which were not properly modeled in case of static initializers. The patch fixes this problem. The problem was originally spotted by Artem Dergachev. http://reviews.llvm.org/D14652 Files: lib/StaticAnalyzer/Core/SValBuilder.cpp test/Analysis/inline.cpp Index: test/Analysis/inline.cpp === --- test/Analysis/inline.cpp +++ test/Analysis/inline.cpp @@ -275,7 +275,7 @@ clang_analyzer_eval(defaultReferenceZero(1) == -1); // expected-warning{{TRUE}} clang_analyzer_eval(defaultReferenceZero() == 0); // expected-warning{{TRUE}} -} + } double defaultFloatReference(const double &i = 42) { return -i; @@ -300,6 +300,13 @@ clang_analyzer_eval(defaultString("xyz") == 'y'); // expected-warning{{TRUE}} clang_analyzer_eval(defaultString() == 'b'); // expected-warning{{TRUE}} } + + const void * const void_string = "abc"; + + void testBitcastedString() { +clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} +clang_analyzer_eval(0 != ((char *)void_string)[1]); // expected-warning{{TRUE}} + } } namespace OperatorNew { Index: lib/StaticAnalyzer/Core/SValBuilder.cpp === --- lib/StaticAnalyzer/Core/SValBuilder.cpp +++ lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -275,11 +275,17 @@ case Stmt::ImplicitCastExprClass: { const CastExpr *CE = cast(E); -if (CE->getCastKind() == CK_ArrayToPointerDecay) { - Optional ArrayVal = getConstantVal(CE->getSubExpr()); - if (!ArrayVal) +switch (CE->getCastKind()) { +default: + break; +case CK_ArrayToPointerDecay: +case CK_BitCast: { + const Expr *SE = CE->getSubExpr(); + Optional Val = getConstantVal(SE); + if (!Val) return None; - return evalCast(*ArrayVal, CE->getType(), CE->getSubExpr()->getType()); + return evalCast(*Val, CE->getType(), SE->getType()); +} } // FALLTHROUGH } Index: test/Analysis/inline.cpp === --- test/Analysis/inline.cpp +++ test/Analysis/inline.cpp @@ -275,7 +275,7 @@ clang_analyzer_eval(defaultReferenceZero(1) == -1); // expected-warning{{TRUE}} clang_analyzer_eval(defaultReferenceZero() == 0); // expected-warning{{TRUE}} -} + } double defaultFloatReference(const double &i = 42) { return -i; @@ -300,6 +300,13 @@ clang_analyzer_eval(defaultString("xyz") == 'y'); // expected-warning{{TRUE}} clang_analyzer_eval(defaultString() == 'b'); // expected-warning{{TRUE}} } + + const void * const void_string = "abc"; + + void testBitcastedString() { +clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} +clang_analyzer_eval(0 != ((char *)void_string)[1]); // expected-warning{{TRUE}} + } } namespace OperatorNew { Index: lib/StaticAnalyzer/Core/SValBuilder.cpp === --- lib/StaticAnalyzer/Core/SValBuilder.cpp +++ lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -275,11 +275,17 @@ case Stmt::ImplicitCastExprClass: { const CastExpr *CE = cast(E); -if (CE->getCastKind() == CK_ArrayToPointerDecay) { - Optional ArrayVal = getConstantVal(CE->getSubExpr()); - if (!ArrayVal) +switch (CE->getCastKind()) { +default: + break; +case CK_ArrayToPointerDecay: +case CK_BitCast: { + const Expr *SE = CE->getSubExpr(); + Optional Val = getConstantVal(SE); + if (!Val) return None; - return evalCast(*ArrayVal, CE->getType(), CE->getSubExpr()->getType()); + return evalCast(*Val, CE->getType(), SE->getType()); +} } // FALLTHROUGH } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits