[UB] Don't allocate space for contained types and then try to copy the

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
This commit is contained in:
Chandler Carruth 2015-08-04 03:48:26 +00:00
parent 56880d0733
commit 1a092e8289

View 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);