From: Justin Bogner Date: Sun, 21 Jun 2015 20:32:40 +0000 (+0000) Subject: ASTReader: Treat InputFileOffsets as unaligned to avoid UB X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4d78fb0b89762e68fc87ab764cae20a1f5840ad4;p=clang ASTReader: Treat InputFileOffsets as unaligned to avoid UB This is a better approach to fixing the undefined behaviour I tried to fix in r240228. This data doesn't necessarily have suitable alignment for uint64_t, so use unaligned_uint64_t instead. This fixes 225 test failures when clang is built with ubsan. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240247 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Serialization/Module.h b/include/clang/Serialization/Module.h index 5571d91a54..c98ced41aa 100644 --- a/include/clang/Serialization/Module.h +++ b/include/clang/Serialization/Module.h @@ -20,6 +20,7 @@ #include "clang/Serialization/ContinuousRangeMap.h" #include "llvm/ADT/SetVector.h" #include "llvm/Bitcode/BitstreamReader.h" +#include "llvm/Support/Endian.h" #include #include @@ -206,7 +207,7 @@ public: llvm::BitstreamCursor InputFilesCursor; /// \brief Offsets for all of the input file entries in the AST file. - const uint64_t *InputFileOffsets; + const llvm::support::unaligned_uint64_t *InputFileOffsets; /// \brief The input files that have been loaded from this AST file. std::vector InputFilesLoaded; diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index d75b5eb73d..7242793be2 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2307,7 +2307,8 @@ ASTReader::ReadControlBlock(ModuleFile &F, case INPUT_FILE_OFFSETS: NumInputs = Record[0]; NumUserInputs = Record[1]; - F.InputFileOffsets = (const uint64_t *)Blob.data(); + F.InputFileOffsets = + (const llvm::support::unaligned_uint64_t *)Blob.data(); F.InputFilesLoaded.resize(NumInputs); break; }