summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Object
diff options
context:
space:
mode:
authorPavel Labath <pavel@labath.sk>2019-03-21 10:21:55 +0000
committerPavel Labath <pavel@labath.sk>2019-03-21 10:21:55 +0000
commit045b8544fd2c4e14f7e72e0df2bc681d823b0838 (patch)
treeba4382bfbeb68c2a72ac25d28eb80baa17068243 /llvm/unittests/Object
parent0a9541e9ed3fa44fcd36dbbb3fce4deb147d5688 (diff)
downloadbcm5719-llvm-045b8544fd2c4e14f7e72e0df2bc681d823b0838.tar.gz
bcm5719-llvm-045b8544fd2c4e14f7e72e0df2bc681d823b0838.zip
Fix two more issues with r356652
The first problem was a use-after-free in the tests (detected by asan bots). The temporary array created for the "create" call is guaranteed to live only until the end of the statement. The fix there is to store the test data in a local variable to ensure it has the right lifetime The second issue is broken BUILD_SHARED_LIBS build, which I fix by adding the appropriate BinaryFormat dependency to the Object unit tests. llvm-svn: 356655
Diffstat (limited to 'llvm/unittests/Object')
-rw-r--r--llvm/unittests/Object/CMakeLists.txt1
-rw-r--r--llvm/unittests/Object/MinidumpTest.cpp263
2 files changed, 130 insertions, 134 deletions
diff --git a/llvm/unittests/Object/CMakeLists.txt b/llvm/unittests/Object/CMakeLists.txt
index e0fc6ce8893..e0be1ba2b2f 100644
--- a/llvm/unittests/Object/CMakeLists.txt
+++ b/llvm/unittests/Object/CMakeLists.txt
@@ -1,4 +1,5 @@
set(LLVM_LINK_COMPONENTS
+ BinaryFormat
Object
)
diff --git a/llvm/unittests/Object/MinidumpTest.cpp b/llvm/unittests/Object/MinidumpTest.cpp
index 6ebb2a98952..97fde12c0f8 100644
--- a/llvm/unittests/Object/MinidumpTest.cpp
+++ b/llvm/unittests/Object/MinidumpTest.cpp
@@ -21,19 +21,20 @@ static Expected<std::unique_ptr<MinidumpFile>> create(ArrayRef<uint8_t> Data) {
}
TEST(MinidumpFile, BasicInterface) {
- // A very simple minidump file which contains just a single stream.
- auto ExpectedFile =
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ std::vector<uint8_t> Data{ // Header
+ 'M', 'D', 'M', 'P', // Signature
+ 0x93, 0xa7, 0, 0, // Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
// Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'});
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ // A very simple minidump file which contains just a single stream.
+ auto ExpectedFile = create(Data);
ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
const MinidumpFile &File = **ExpectedFile;
const Header &H = File.header();
@@ -60,135 +61,127 @@ TEST(MinidumpFile, BasicInterface) {
// Use the input from the previous test, but corrupt it in various ways
TEST(MinidumpFile, create_ErrorCases) {
- // File too short
- EXPECT_THAT_EXPECTED(create({'M', 'D', 'M', 'P'}), Failed<BinaryError>());
+ std::vector<uint8_t> FileTooShort{'M', 'D', 'M', 'P'};
+ EXPECT_THAT_EXPECTED(create(FileTooShort), Failed<BinaryError>());
- // Wrong Signature
- EXPECT_THAT_EXPECTED(
- create({ // Header
- '!', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
-
- // Wrong Version
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x39, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
+ std::vector<uint8_t> WrongSignature{
+ // Header
+ '!', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(WrongSignature), Failed<BinaryError>());
- // Stream directory after EOF
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 1, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
+ std::vector<uint8_t> WrongVersion{
+ // Header
+ 'M', 'D', 'M', 'P', 0x39, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(WrongVersion), Failed<BinaryError>());
- // Truncated stream directory
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 1, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
+ std::vector<uint8_t> DirectoryAfterEOF{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 1, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(DirectoryAfterEOF), Failed<BinaryError>());
- // Stream0 after EOF
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 1, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
+ std::vector<uint8_t> TruncatedDirectory{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 1, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(TruncatedDirectory), Failed<BinaryError>());
- // Truncated Stream0
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 8, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
+ std::vector<uint8_t> Stream0AfterEOF{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 1, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(Stream0AfterEOF), Failed<BinaryError>());
- // Duplicate Stream
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 2, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x40, 0, 0, 0, // RVA
- // Stream
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x40, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
+ std::vector<uint8_t> Stream0Truncated{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 8, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(Stream0Truncated), Failed<BinaryError>());
- // Stream matching one of the DenseMapInfo magic values
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 0xff, 0xff, 0xff, 0xff, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
+ std::vector<uint8_t> DuplicateStream{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 2, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x40, 0, 0, 0, // RVA
+ // Stream
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x40, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(DuplicateStream), Failed<BinaryError>());
+
+ std::vector<uint8_t> DenseMapInfoConflict{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 0xff, 0xff, 0xff, 0xff, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(DenseMapInfoConflict), Failed<BinaryError>());
}
TEST(MinidumpFile, IngoresDummyStreams) {
- auto ExpectedFile = create({
+ std::vector<uint8_t> TwoDummyStreams{
// Header
'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
2, 0, 0, 0, // NumberOfStreams,
@@ -200,7 +193,8 @@ TEST(MinidumpFile, IngoresDummyStreams) {
0x20, 0, 0, 0, // RVA
0, 0, 0, 0, 0, 0, 0, 0, // Type, DataSize,
0x20, 0, 0, 0, // RVA
- });
+ };
+ auto ExpectedFile = create(TwoDummyStreams);
ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
const MinidumpFile &File = **ExpectedFile;
ASSERT_EQ(2u, File.streams().size());
@@ -210,7 +204,7 @@ TEST(MinidumpFile, IngoresDummyStreams) {
}
TEST(MinidumpFile, getSystemInfo) {
- auto ExpectedFile = create({
+ std::vector<uint8_t> Data{
// Header
'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
1, 0, 0, 0, // NumberOfStreams,
@@ -229,7 +223,8 @@ TEST(MinidumpFile, getSystemInfo) {
'L', 'L', 'V', 'M', 'L', 'L', 'V', 'M', 'L', 'L', 'V', 'M', // VendorID
1, 2, 3, 4, 5, 6, 7, 8, // VersionInfo, FeatureInfo
9, 0, 1, 2, // AMDExtendedFeatures
- });
+ };
+ auto ExpectedFile = create(Data);
ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
const MinidumpFile &File = **ExpectedFile;
OpenPOWER on IntegriCloud