diff options
author | Justin Bogner <mail@justinbogner.com> | 2015-06-21 20:32:40 +0000 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2015-06-21 20:32:40 +0000 |
commit | 4c18324b8b5d0eaa1199634e3809ee52f7a851a0 (patch) | |
tree | f71527126ff6ed24ab482420c22449f1e9eacac0 /clang | |
parent | ca9c0ccbc03716701ea4b87f1e509e1c87ab17d4 (diff) | |
download | bcm5719-llvm-4c18324b8b5d0eaa1199634e3809ee52f7a851a0.tar.gz bcm5719-llvm-4c18324b8b5d0eaa1199634e3809ee52f7a851a0.zip |
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.
llvm-svn: 240247
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Serialization/Module.h | 3 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 3 |
2 files changed, 4 insertions, 2 deletions
diff --git a/clang/include/clang/Serialization/Module.h b/clang/include/clang/Serialization/Module.h index 5571d91a541..c98ced41aae 100644 --- a/clang/include/clang/Serialization/Module.h +++ b/clang/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 <memory> #include <string> @@ -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<InputFile> InputFilesLoaded; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index d75b5eb73d5..7242793be22 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/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; } |