From: Daniel Marjamaki Date: Tue, 7 Mar 2017 19:20:48 +0000 (+0000) Subject: [analyzer] Fix crashes in CastToStruct checker for undefined structs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0bdcd308fc30409f718af5ceefbda8816342c9fe;p=clang [analyzer] Fix crashes in CastToStruct checker for undefined structs This crash was reported in https://bugs.llvm.org//show_bug.cgi?id=31173 Differential Revision: https://reviews.llvm.org/D28297 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@297187 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp b/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp index 16a475ae9d..65e81315f0 100644 --- a/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp @@ -84,6 +84,10 @@ bool CastToStructVisitor::VisitCastExpr(const CastExpr *CE) { if (!VD || VD->getType()->isReferenceType()) return true; + if (ToPointeeTy->isIncompleteType() || + OrigPointeeTy->isIncompleteType()) + return true; + // Warn when there is widening cast. unsigned ToWidth = Ctx.getTypeInfo(ToPointeeTy).Width; unsigned OrigWidth = Ctx.getTypeInfo(OrigPointeeTy).Width; diff --git a/test/Analysis/cast-to-struct.cpp b/test/Analysis/cast-to-struct.cpp index 0a6b8ff0f5..c3aba023c5 100644 --- a/test/Analysis/cast-to-struct.cpp +++ b/test/Analysis/cast-to-struct.cpp @@ -65,3 +65,17 @@ void intToStruct(int *P) { void *VP = P; Abc = (struct ABC *)VP; } + +// https://llvm.org/bugs/show_bug.cgi?id=31173 +void dontCrash1(struct AB X) { + struct UndefS *S = (struct UndefS *)&X; +} + +struct S; +struct T { + struct S *P; +}; +extern struct S Var1, Var2; +void dontCrash2() { + ((struct T *) &Var1)->P = &Var2; +}