mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-18 17:55:18 +00:00
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! llvm-svn: 217708
This commit is contained in:
parent
683e1e4686
commit
1635d485a8
@ -190,6 +190,9 @@ RawInstrProfReader<IntPtrT>::readNextHeader(const char *CurrentPos) {
|
||||
// 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>()))
|
||||
|
@ -39,11 +39,9 @@ RUN: printf '\0\0\0\0\0' >> %t-foo-padded.profraw
|
||||
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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user