[UB] Don't allocate space for contained types and then try to copy the
authorChandler Carruth <chandlerc@gmail.com>
Tue, 4 Aug 2015 03:48:26 +0000 (03:48 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Tue, 4 Aug 2015 03:48:26 +0000 (03:48 +0000)
contained types into the space when we have no contained types. This
fixes the UB stemming from a call to memcpy with a null pointer. This
also reduces the calls to allocate because this actually happens in
a notable client - Clang.

Found by UBSan.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243944 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/Type.cpp

index 1b46b7b..18c2e8c 100644 (file)
@@ -420,6 +420,12 @@ void StructType::setBody(ArrayRef<Type*> Elements, bool isPacked) {
   if (isPacked)
     setSubclassData(getSubclassData() | SCDB_Packed);
 
+  if (Elements.empty()) {
+    ContainedTys = nullptr;
+    NumContainedTys = 0;
+    return;
+  }
+
   unsigned NumElements = Elements.size();
   Type **Elts = getContext().pImpl->TypeAllocator.Allocate<Type*>(NumElements);
   memcpy(Elts, Elements.data(), sizeof(Elements[0]) * NumElements);