diff options
author | Kostya Serebryany <kcc@google.com> | 2013-04-04 06:52:40 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2013-04-04 06:52:40 +0000 |
commit | 583025ddc52988cdcedb5dee57e0d66a0c586340 (patch) | |
tree | e8b83ce8d613558198353cbddf262e425fc403d1 /lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc | |
parent | 78b580f3d40132816f813c3dbf073d824137436a (diff) | |
download | compiler-rt-583025ddc52988cdcedb5dee57e0d66a0c586340.tar.gz |
[sanitizer] while doing fast unwinding make sure that the frame pointer is aligned; fix lint
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@178747 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc')
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc b/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc index 202525596..3d352cb97 100644 --- a/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc +++ b/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc @@ -28,12 +28,16 @@ class FastUnwindTest : public ::testing::Test { StackTrace trace; }; +static uptr PC(uptr idx) { + return (1<<20) + idx; +} + void FastUnwindTest::SetUp() { // Fill an array of pointers with fake fp+retaddr pairs. Frame pointers have // even indices. for (uptr i = 0; i+1 < ARRAY_SIZE(fake_stack); i += 2) { fake_stack[i] = (uptr)&fake_stack[i+2]; // fp - fake_stack[i+1] = i+1; // retaddr + fake_stack[i+1] = PC(i + 1); // retaddr } // Mark the last fp as zero to terminate the stack trace. fake_stack[RoundDownTo(ARRAY_SIZE(fake_stack) - 1, 2)] = 0; @@ -42,7 +46,7 @@ void FastUnwindTest::SetUp() { fake_top = (uptr)&fake_stack[ARRAY_SIZE(fake_stack) + 2]; // Bottom is one slot before the start because FastUnwindStack uses >. fake_bottom = (uptr)&fake_stack[-1]; - start_pc = 0; + start_pc = PC(0); // This is common setup done by __asan::GetStackTrace(). trace.size = 0; @@ -57,7 +61,7 @@ TEST_F(FastUnwindTest, Basic) { EXPECT_EQ(6U, trace.size); EXPECT_EQ(start_pc, trace.trace[0]); for (uptr i = 1; i <= 5; i++) { - EXPECT_EQ(i*2 - 1, trace.trace[i]); + EXPECT_EQ(PC(i*2 - 1), trace.trace[i]); } } @@ -71,8 +75,22 @@ TEST_F(FastUnwindTest, FramePointerLoop) { EXPECT_EQ(4U, trace.size); EXPECT_EQ(start_pc, trace.trace[0]); for (uptr i = 1; i <= 3; i++) { - EXPECT_EQ(i*2 - 1, trace.trace[i]); + EXPECT_EQ(PC(i*2 - 1), trace.trace[i]); } } +TEST_F(FastUnwindTest, MisalignedFramePointer) { + // Make one fp misaligned. + fake_stack[4] += 3; + trace.FastUnwindStack(start_pc, (uptr)&fake_stack[0], + fake_top, fake_bottom); + // Should get all on-stack retaddrs up to the 4th slot and start_pc. + EXPECT_EQ(4U, trace.size); + EXPECT_EQ(start_pc, trace.trace[0]); + for (uptr i = 1; i < 4U; i++) { + EXPECT_EQ(PC(i*2 - 1), trace.trace[i]); + } +} + + } // namespace __sanitizer |