Skip to content

Commit

Permalink
[BTF] Fix BTFParserTest.cpp for unaligned access after D149058
Browse files Browse the repository at this point in the history
Test bot reported an issue with unit tests for D149058 in [1]:

  [==========] Running 1 test from 1 test suite.
  [----------] Global test environment set-up.
  [----------] 1 test from BTFParserTest
  [ RUN      ] BTFParserTest.simpleCorrectInput
  /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/unittests/DebugInfo/BTF/BTFParserTest.cpp:141:33:
  runtime error: upcast of misaligned address 0x7facce60411f for type 'llvm::SmallString<0>', which requires 8 byte alignment
  0x7facce60411f: note: pointer points here
   64 00 00 00 37  41 60 ce ac 7f 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00
               ^
  SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
  /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/unittests/DebugInfo/BTF/BTFParserTest.cpp:141:33

The issue is caused by attribute "packed" used for too many things:

  #pragma pack(push, 1)
  struct MockData1 {
    struct B {
      ...
    } BTF;
    struct E {
      ...
    } Ext;

    int BTFSectionLen = sizeof(BTF);
    int ExtSectionLen = sizeof(Ext);

    SmallString<0> Storage;
    std::unique_ptr<ObjectFile> Obj;

  }
  #pragma pack(pop)

Access to unaligned pointers in `Storage`/`Obj` causes unaligned
access errors.

To fix this #pragma directives are pushed invards to apply only to `B`
and `E` definitions.

[1] https://lab.llvm.org/buildbot/#/builders/5/builds/35040

Differential Revision: https://reviews.llvm.org/D155176
  • Loading branch information
eddyz87 committed Jul 13, 2023
1 parent 701c4ad commit 490e8e2
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions llvm/unittests/DebugInfo/BTF/BTFParserTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ namespace {
// modified before a call to `makeObj()` to test parser with invalid
// input, etc.

struct MockData1 {
// Use "pragma pack" to model .BTF & .BTF.ext sections content using
// 'struct' objects. This pragma is supported by CLANG, GCC & MSVC,
// which matters for LLVM CI.
#pragma pack(push, 1)
struct MockData1 {
struct B {
BTF::Header Header = {};
// no types
Expand Down Expand Up @@ -100,6 +100,7 @@ struct MockData1 {
Header.LineInfoLen = sizeof(Lines);
}
} Ext;
#pragma pack(pop)

int BTFSectionLen = sizeof(BTF);
int ExtSectionLen = sizeof(Ext);
Expand Down Expand Up @@ -148,7 +149,6 @@ struct MockData1 {
return *Obj.get();
}
};
#pragma pack(pop)

TEST(BTFParserTest, simpleCorrectInput) {
BTFParser BTF;
Expand Down

0 comments on commit 490e8e2

Please sign in to comment.