r297187 - [analyzer] Fix crashes in CastToStruct checker for undefined structs
Daniel Marjamaki via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 7 11:20:48 PST 2017
Author: danielmarjamaki
Date: Tue Mar 7 13:20:48 2017
New Revision: 297187
URL: http://llvm.org/viewvc/llvm-project?rev=297187&view=rev
Log:
[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
Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp
cfe/trunk/test/Analysis/cast-to-struct.cpp
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp?rev=297187&r1=297186&r2=297187&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/CastToStructChecker.cpp Tue Mar 7 13:20:48 2017
@@ -84,6 +84,10 @@ bool CastToStructVisitor::VisitCastExpr(
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;
Modified: cfe/trunk/test/Analysis/cast-to-struct.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cast-to-struct.cpp?rev=297187&r1=297186&r2=297187&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/cast-to-struct.cpp (original)
+++ cfe/trunk/test/Analysis/cast-to-struct.cpp Tue Mar 7 13:20:48 2017
@@ -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;
+}
More information about the cfe-commits
mailing list