r183359 - [analyzer] Fix a crash that occurs when processing an rvalue array.

Richard Smith richard at metafoo.co.uk
Wed Jun 5 17:51:57 PDT 2013


On Wed, Jun 5, 2013 at 5:19 PM, Anna Zaks <ganna at apple.com> wrote:

> Author: zaks
> Date: Wed Jun  5 19:19:36 2013
> New Revision: 183359
>
> URL: http://llvm.org/viewvc/llvm-project?rev=183359&view=rev
> Log:
> [analyzer] Fix a crash that occurs when processing an rvalue array.
>
> When processing ArrayToPointerDecay, we expect the array to be a location,
> not a LazyCompoundVal.
> Special case the rvalue arrays by using a location to represent them. This
> case is handled similarly
> elsewhere in the code.
>

Hmm, maybe we should be generating a MaterializeTemporaryExpr between the
ImplicitCastExpr and the array temporary?


> Fixes PR16206.
>
> Modified:
>     cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>     cfe/trunk/test/SemaTemplate/array-to-pointer-decay.cpp
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=183359&r1=183358&r2=183359&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Wed Jun  5 19:19:36
> 2013
> @@ -1724,7 +1724,24 @@ void ExprEngine::VisitMemberExpr(const M
>
>    FieldDecl *field = cast<FieldDecl>(Member);
>    SVal L = state->getLValue(field, baseExprVal);
> -  if (M->isGLValue()) {
> +
> +  if (M->isGLValue() || M->getType()->isArrayType()) {
> +
> +    // We special case rvalue of array type because the analyzer cannot
> reason
> +    // about it, since we expect all regions to be wrapped in Locs. So we
> will
> +    // treat these as lvalues assuming that they will decay to pointers
> as soon
> +    // as they are used. Below
> +    if (!M->isGLValue()) {
> +      assert(M->getType()->isArrayType());
> +      const ImplicitCastExpr *PE =
> +        dyn_cast<ImplicitCastExpr>(Pred->getParentMap().getParent(M));
> +      if (!PE || PE->getCastKind() != CK_ArrayToPointerDecay) {
> +        assert(false &&
> +               "We assume that array is always wrapped in
> ArrayToPointerDecay");
> +        L = UnknownVal();
> +      }
> +    }
> +
>      if (field->getType()->isReferenceType()) {
>        if (const MemRegion *R = L.getAsRegion())
>          L = state->getSVal(R);
>
> Modified: cfe/trunk/test/SemaTemplate/array-to-pointer-decay.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/array-to-pointer-decay.cpp?rev=183359&r1=183358&r2=183359&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/array-to-pointer-decay.cpp (original)
> +++ cfe/trunk/test/SemaTemplate/array-to-pointer-decay.cpp Wed Jun  5
> 19:19:36 2013
> @@ -24,3 +24,15 @@ template <typename Type> static bool san
>    return !c->start;
>  }
>  bool closure = sanitize<int>();
> +
> +// PR16206
> +typedef struct {
> +       char x[4];
> +} chars;
> +
> +chars getChars();
> +void use(char *);
> +
> +void test() {
> +       use(getChars().x);
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130605/a9b6930a/attachment.html>


More information about the cfe-commits mailing list