[cfe-commits] r168757 - in /cfe/trunk: lib/StaticAnalyzer/Core/ExprEngineC.cpp test/Analysis/misc-ps-region-store.cpp

Jordan Rose jordan_rose at apple.com
Tue Nov 27 17:54:57 PST 2012


Should we revert the previous "fix" in RegionStore, then?


On Nov 27, 2012, at 17:49 , Ted Kremenek <kremenek at apple.com> wrote:

> Author: kremenek
> Date: Tue Nov 27 19:49:01 2012
> New Revision: 168757
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=168757&view=rev
> Log:
> Fix another false positive due to a CXX temporary object appearing in a C initializer.
> 
> The stop-gap here is to just drop such objects when processing the InitListExpr.
> We still need a better solution.
> 
> Fixes <rdar://problem/12755044>.
> 
> Modified:
>    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp
>    cfe/trunk/test/Analysis/misc-ps-region-store.cpp
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp?rev=168757&r1=168756&r2=168757&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp Tue Nov 27 19:49:01 2012
> @@ -581,8 +581,10 @@
> 
>     for (InitListExpr::const_reverse_iterator it = IE->rbegin(),
>          ei = IE->rend(); it != ei; ++it) {
> -      vals = getBasicVals().consVals(state->getSVal(cast<Expr>(*it), LCtx),
> -                                     vals);
> +      SVal V = state->getSVal(cast<Expr>(*it), LCtx);
> +      if (dyn_cast_or_null<CXXTempObjectRegion>(V.getAsRegion()))
> +        V = UnknownVal();
> +      vals = getBasicVals().consVals(V, vals);
>     }
> 
>     B.generateNode(IE, Pred,
> 
> Modified: cfe/trunk/test/Analysis/misc-ps-region-store.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-ps-region-store.cpp?rev=168757&r1=168756&r2=168757&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/misc-ps-region-store.cpp (original)
> +++ cfe/trunk/test/Analysis/misc-ps-region-store.cpp Tue Nov 27 19:49:01 2012
> @@ -656,3 +656,41 @@
>   return w.x;
> }
> 
> +// This testcase tests whether we treat the anonymous union and union
> +// the same way.  This previously resulted in a "return of stack address"
> +// warning because the anonymous union resulting in a temporary object
> +// getting put into the initializer.  We still aren't handling this correctly,
> +// but now if a temporary object appears in an initializer we just ignore it.
> +// Fixes <rdar://problem/12755044>.
> +
> +struct Rdar12755044_foo
> +{
> +    struct Rdar12755044_bar
> +    {
> +        union baz
> +        {
> +            int   i;
> +        };
> +    } aBar;
> +};
> +
> +struct Rdar12755044_foo_anon
> +{
> +    struct Rdar12755044_bar
> +    {
> +        union
> +        {
> +            int   i;
> +        };
> +    } aBar;
> +};
> +
> +const Rdar12755044_foo_anon *radar12755044_anon() {
> +  static const Rdar12755044_foo_anon Rdar12755044_foo_list[] = { { { } } };
> +  return Rdar12755044_foo_list; // no-warning
> +}
> +
> +const Rdar12755044_foo *radar12755044() {
> +  static const Rdar12755044_foo Rdar12755044_foo_list[] = { { { } } };
> +  return Rdar12755044_foo_list; // no-warning
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list