From: Chandler Carruth Date: Tue, 4 Aug 2015 03:53:00 +0000 (+0000) Subject: [UB] Another place where we were trying to put string data into X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=35ae9a517d04331485e95059bd154c4a9932b482;p=clang [UB] Another place where we were trying to put string data into a BumpPtrAllocator. This at least now handles the case where there is no concatentation without calling memcpy on a null pointer. It might be interesting to handle the case where everything is empty without round-tripping through the allocator, but it wasn't clear to me if the pointer returned is significant in any way, so I've left it in a conservatively more-correct state. Again, found with UBSan. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243948 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h index 72cdac3e93..33204fb362 100644 --- a/lib/CodeGen/CGDebugInfo.h +++ b/lib/CodeGen/CGDebugInfo.h @@ -485,8 +485,10 @@ private: /// are concatenated. StringRef internString(StringRef A, StringRef B = StringRef()) { char *Data = DebugInfoNames.Allocate(A.size() + B.size()); - std::memcpy(Data, A.data(), A.size()); - std::memcpy(Data + A.size(), B.data(), B.size()); + if (!A.empty()) + std::memcpy(Data, A.data(), A.size()); + if (!B.empty()) + std::memcpy(Data + A.size(), B.data(), B.size()); return StringRef(Data, A.size() + B.size()); } };