]> granicus.if.org Git - clang/commitdiff
ASTReader: Treat InputFileOffsets as unaligned to avoid UB
authorJustin Bogner <mail@justinbogner.com>
Sun, 21 Jun 2015 20:32:40 +0000 (20:32 +0000)
committerJustin Bogner <mail@justinbogner.com>
Sun, 21 Jun 2015 20:32:40 +0000 (20:32 +0000)
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

include/clang/Serialization/Module.h
lib/Serialization/ASTReader.cpp

index 5571d91a541141a2fcd61d94c06a0bc14f6b23b7..c98ced41aae5664662aa623312a8e32ee4bd5296 100644 (file)
@@ -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;
index d75b5eb73d51b38209270df2f61b542483655839..7242793be22025966ed35ec24860ce03fa0b24e0 100644 (file)
@@ -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;
     }