From: Chandler Carruth Date: Tue, 4 Aug 2015 03:53:01 +0000 (+0000) Subject: [UB] Guard two calls to memcpy in generated attribute code to handle X-Git-Tag: studio-1.4~940 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=38a45cc686e7110e51e154757302827d384d538e;p=platform%2Fupstream%2Fllvm.git [UB] Guard two calls to memcpy in generated attribute code to handle null StringRef objects as inputs. Found by UBSan. llvm-svn: 243949 --- diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index d8ecd2b..14ffbe0 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -326,7 +326,8 @@ namespace { OS << " " << getLowerName() << "Length = S.size();\n"; OS << " this->" << getLowerName() << " = new (C, 1) char [" << getLowerName() << "Length];\n"; - OS << " std::memcpy(this->" << getLowerName() << ", S.data(), " + OS << " if (!S.empty())\n"; + OS << " std::memcpy(this->" << getLowerName() << ", S.data(), " << getLowerName() << "Length);\n"; OS << " }"; } @@ -337,7 +338,8 @@ namespace { OS << "A->get" << getUpperName() << "()"; } void writeCtorBody(raw_ostream &OS) const override { - OS << " std::memcpy(" << getLowerName() << ", " << getUpperName() + OS << " if (!" << getUpperName() << ".empty())\n"; + OS << " std::memcpy(" << getLowerName() << ", " << getUpperName() << ".data(), " << getLowerName() << "Length);"; } void writeCtorInitializers(raw_ostream &OS) const override {