[llvm] r217708 - llvm-profdata: Avoid undefined behaviour when reading raw profiles

Justin Bogner mail at justinbogner.com
Fri Sep 12 14:22:56 PDT 2014


Author: bogner
Date: Fri Sep 12 16:22:55 2014
New Revision: 217708

URL: http://llvm.org/viewvc/llvm-project?rev=217708&view=rev
Log:
llvm-profdata: Avoid undefined behaviour when reading raw profiles

The raw profiles that are generated in compiler-rt always add padding
so that each profile is aligned, so we can simply treat files that
don't have this property as malformed.

Caught by Alexey's new ubsan bot. Thanks!

Modified:
    llvm/trunk/lib/ProfileData/InstrProfReader.cpp
    llvm/trunk/test/tools/llvm-profdata/raw-two-profiles.test

Modified: llvm/trunk/lib/ProfileData/InstrProfReader.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/InstrProfReader.cpp?rev=217708&r1=217707&r2=217708&view=diff
==============================================================================
--- llvm/trunk/lib/ProfileData/InstrProfReader.cpp (original)
+++ llvm/trunk/lib/ProfileData/InstrProfReader.cpp Fri Sep 12 16:22:55 2014
@@ -190,6 +190,9 @@ RawInstrProfReader<IntPtrT>::readNextHea
   // garbage at the end of the file.
   if (CurrentPos + sizeof(RawHeader) > End)
     return instrprof_error::malformed;
+  // The writer ensures each profile is padded to start at an aligned address.
+  if (reinterpret_cast<size_t>(CurrentPos) % alignOf<uint64_t>())
+    return instrprof_error::malformed;
   // The magic should have the same byte order as in the previous header.
   uint64_t Magic = *reinterpret_cast<const uint64_t *>(CurrentPos);
   if (Magic != swap(getRawMagic<IntPtrT>()))

Modified: llvm/trunk/test/tools/llvm-profdata/raw-two-profiles.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-profdata/raw-two-profiles.test?rev=217708&r1=217707&r2=217708&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-profdata/raw-two-profiles.test (original)
+++ llvm/trunk/test/tools/llvm-profdata/raw-two-profiles.test Fri Sep 12 16:22:55 2014
@@ -39,11 +39,9 @@ RUN: printf '\0\0\0\0\0' >> %t-foo-padde
 RUN: cat %t-bar.profraw > %t-bar-padded.profraw
 RUN: printf '\0\0\0\0\0' >> %t-bar-padded.profraw
 
-RUN: cat %t-foo.profraw %t-bar.profraw > %t-nopad.profraw
 RUN: cat %t-foo-padded.profraw %t-bar.profraw > %t-pad-between.profraw
 RUN: cat %t-foo-padded.profraw %t-bar-padded.profraw > %t-pad.profraw
 
-RUN: llvm-profdata show %t-nopad.profraw -all-functions -counts | FileCheck %s
 RUN: llvm-profdata show %t-pad-between.profraw -all-functions -counts | FileCheck %s
 RUN: llvm-profdata show %t-pad.profraw -all-functions -counts | FileCheck %s
 





More information about the llvm-commits mailing list