[PATCH] [analyzer] Enable usage of temporaries in InitListExprs
Pavel Labath
labath at google.com
Thu Aug 8 07:53:46 PDT 2013
+ kremenek at apple.com
Original patch was made by Ted, but I couldn't find his username on the
differential website thingy.
On 8 August 2013 16:51, Pavel Labath <labath at google.com> wrote:
> Hi jordan_rose,
>
> ExprEngine had code which specificaly disabled using CXXTempObjectRegions
> in
> InitListExprs. This was a hack put in r168757 to silence a false positive.
>
> The underlying problem seems to have been fixed in the mean time, as
> removing
> this code doesn't seem to break anything. Therefore I propose to remove it
> and
> solve PR16629 in the process.
>
> http://llvm-reviews.chandlerc.com/D1325
>
> Files:
> lib/StaticAnalyzer/Core/ExprEngineC.cpp
> test/Analysis/temporaries.cpp
>
> Index: lib/StaticAnalyzer/Core/ExprEngineC.cpp
> ===================================================================
> --- lib/StaticAnalyzer/Core/ExprEngineC.cpp
> +++ lib/StaticAnalyzer/Core/ExprEngineC.cpp
> @@ -596,8 +596,6 @@
> for (InitListExpr::const_reverse_iterator it = IE->rbegin(),
> ei = IE->rend(); it != ei; ++it) {
> SVal V = state->getSVal(cast<Expr>(*it), LCtx);
> - if (dyn_cast_or_null<CXXTempObjectRegion>(V.getAsRegion()))
> - V = UnknownVal();
> vals = getBasicVals().consVals(V, vals);
> }
>
> Index: test/Analysis/temporaries.cpp
> ===================================================================
> --- test/Analysis/temporaries.cpp
> +++ test/Analysis/temporaries.cpp
> @@ -157,3 +157,39 @@
> clang_analyzer_eval(threadDirectRef.value == 42); //
> expected-warning{{TRUE}}
> #endif
> }
> +
> +namespace PR16629 {
> + struct A {
> + explicit A(int* p_) : p(p_) {}
> + int* p;
> + };
> +
> + extern void escape(const A*[]);
> + extern void check(int);
> +
> + void callEscape(const A& a) {
> + const A* args[] = { &a };
> + escape(args);
> + }
> +
> + void testNoWarning() {
> + int x;
> + callEscape(A(&x));
> + check(x); // Analyzer used to give a "x is uninitialized warning" here
> + }
> +
> + void set(const A*a[]) {
> + *a[0]->p = 47;
> + }
> +
> + void callSet(const A& a) {
> + const A* args[] = { &a };
> + set(args);
> + }
> +
> + void testConsistency() {
> + int x;
> + callSet(A(&x));
> + clang_analyzer_eval(x == 47); // expected-warning{{TRUE}}
> + }
> +}
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130808/344e2278/attachment.html>
More information about the cfe-commits
mailing list