File: | jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp |
Warning: | line 135, column 11 Value stored to 'p2' during its initialization is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* |
2 | * Copyright (c) 2021 SAP SE. All rights reserved. |
3 | * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. |
4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5 | * |
6 | * This code is free software; you can redistribute it and/or modify it |
7 | * under the terms of the GNU General Public License version 2 only, as |
8 | * published by the Free Software Foundation. |
9 | * |
10 | * This code is distributed in the hope that it will be useful, but WITHOUT |
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
13 | * version 2 for more details (a copy is included in the LICENSE file that |
14 | * accompanied this code). |
15 | * |
16 | * You should have received a copy of the GNU General Public License version |
17 | * 2 along with this work; if not, write to the Free Software Foundation, |
18 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
19 | * |
20 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
21 | * or visit www.oracle.com if you need additional information or have any |
22 | * questions. |
23 | */ |
24 | |
25 | #include "precompiled.hpp" |
26 | #include "memory/allocation.hpp" |
27 | #include "runtime/os.hpp" |
28 | #include "services/memTracker.hpp" |
29 | #include "utilities/debug.hpp" |
30 | #include "utilities/ostream.hpp" |
31 | #include "unittest.hpp" |
32 | #include "testutils.hpp" |
33 | |
34 | #if INCLUDE_NMT1 |
35 | |
36 | // This prefix shows up on any c heap corruption NMT detects. If unsure which assert will |
37 | // come, just use this one. |
38 | #define COMMON_NMT_HEAP_CORRUPTION_MESSAGE_PREFIX"NMT corruption" "NMT corruption" |
39 | |
40 | |
41 | |
42 | #define DEFINE_TEST(test_function, expected_assertion_message)static void test_NMT_test_function_(); static void child_NMT_test_function_ () { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_function_ (); exit(0); } class NMT_test_function_vm_assert_Test : public ::testing::Test { public: NMT_test_function_vm_assert_Test() {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_function_vm_assert_Test (NMT_test_function_vm_assert_Test const &) = delete; void operator=(NMT_test_function_vm_assert_Test const &) = delete ;};::testing::TestInfo* const NMT_test_function_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_function_vm_assert", __null, __null, ::testing:: internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 42), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_function_vm_assert_Test >);void NMT_test_function_vm_assert_Test::TestBody() { switch (0) case 0: default: if (::testing::internal::AlwaysTrue()) { const ::testing::internal::RE& gtest_regex = (".*" expected_assertion_message ".*"); ::testing::internal::DeathTest* gtest_dt; if (!::testing ::internal::DeathTest::Create("child_NMT_test_function_()", & gtest_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 42, >est_dt)) { goto gtest_label_42; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing::internal ::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt-> AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_42; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_function_(); }; gtest_dt-> Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); break ; } default: break; } } } else gtest_label_42: return ::testing ::internal::AssertHelper(::testing::TestPartResult::kFatalFailure , "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 42, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_function_() { if (MemTracker ::tracking_level() > NMT_off) { tty->print_cr("NMT overwrite death test, please ignore subsequent error dump." ); test_function (); } else { do { if (!(false)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 42, "guarantee(" "false" ") failed", "fake message ignore this - " expected_assertion_message); ::breakpoint(); } } while (0); } } \ |
43 | TEST_VM_FATAL_ERROR_MSG(NMT, test_function, ".*" expected_assertion_message ".*")static void test_NMT_test_function_(); static void child_NMT_test_function_ () { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_function_ (); exit(0); } class NMT_test_function_vm_assert_Test : public ::testing::Test { public: NMT_test_function_vm_assert_Test() {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_function_vm_assert_Test (NMT_test_function_vm_assert_Test const &) = delete; void operator=(NMT_test_function_vm_assert_Test const &) = delete ;};::testing::TestInfo* const NMT_test_function_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_function_vm_assert", __null, __null, ::testing:: internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 43), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_function_vm_assert_Test >);void NMT_test_function_vm_assert_Test::TestBody() { switch (0) case 0: default: if (::testing::internal::AlwaysTrue()) { const ::testing::internal::RE& gtest_regex = (".*" expected_assertion_message ".*"); ::testing::internal::DeathTest* gtest_dt; if (!::testing ::internal::DeathTest::Create("child_NMT_test_function_()", & gtest_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 43, >est_dt)) { goto gtest_label_43; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing::internal ::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt-> AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_43; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_function_(); }; gtest_dt-> Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); break ; } default: break; } } } else gtest_label_43: return ::testing ::internal::AssertHelper(::testing::TestPartResult::kFatalFailure , "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 43, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_function_() { \ |
44 | if (MemTracker::tracking_level() > NMT_off) { \ |
45 | tty->print_cr("NMT overwrite death test, please ignore subsequent error dump."); \ |
46 | test_function (); \ |
47 | } else { \ |
48 | /* overflow detection requires NMT to be on. If off, fake assert. */ \ |
49 | guarantee(false, \do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 50, "guarantee(" "false" ") failed", "fake message ignore this - " expected_assertion_message); ::breakpoint(); } } while (0) |
50 | "fake message ignore this - " expected_assertion_message)do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 50, "guarantee(" "false" ") failed", "fake message ignore this - " expected_assertion_message); ::breakpoint(); } } while (0); \ |
51 | } \ |
52 | } |
53 | |
54 | /////// |
55 | |
56 | static void test_overwrite_front() { |
57 | address p = (address) os::malloc(1, mtTest); |
58 | *(p - 1) = 'a'; |
59 | os::free(p); |
60 | } |
61 | |
62 | DEFINE_TEST(test_overwrite_front, "header canary broken")static void test_NMT_test_overwrite_front_(); static void child_NMT_test_overwrite_front_ () { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_overwrite_front_ (); exit(0); } class NMT_test_overwrite_front_vm_assert_Test : public ::testing::Test { public: NMT_test_overwrite_front_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_overwrite_front_vm_assert_Test (NMT_test_overwrite_front_vm_assert_Test const &) = delete ; void operator=(NMT_test_overwrite_front_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_overwrite_front_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_overwrite_front_vm_assert", __null, __null, ::testing ::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 62), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_overwrite_front_vm_assert_Test >);void NMT_test_overwrite_front_vm_assert_Test::TestBody( ) { switch (0) case 0: default: if (::testing::internal::AlwaysTrue ()) { const ::testing::internal::RE& gtest_regex = (".*" "header canary broken" ".*"); ::testing::internal::DeathTest* gtest_dt; if (!::testing ::internal::DeathTest::Create("child_NMT_test_overwrite_front_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 62, >est_dt)) { goto gtest_label_62; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing::internal ::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt-> AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_62; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_overwrite_front_(); }; gtest_dt ->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); break; } default: break; } } } else gtest_label_62: return :: testing::internal::AssertHelper(::testing::TestPartResult::kFatalFailure , "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 62, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_overwrite_front_() { if (MemTracker ::tracking_level() > NMT_off) { tty->print_cr("NMT overwrite death test, please ignore subsequent error dump." ); test_overwrite_front (); } else { do { if (!(false)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 62, "guarantee(" "false" ") failed", "fake message ignore this - " "header canary broken"); ::breakpoint(); } } while (0); } } |
63 | |
64 | /////// |
65 | |
66 | static void test_overwrite_back() { |
67 | address p = (address) os::malloc(1, mtTest); |
68 | *(p + 1) = 'a'; |
69 | os::free(p); |
70 | } |
71 | |
72 | DEFINE_TEST(test_overwrite_back, "footer canary broken")static void test_NMT_test_overwrite_back_(); static void child_NMT_test_overwrite_back_ () { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_overwrite_back_ (); exit(0); } class NMT_test_overwrite_back_vm_assert_Test : public ::testing::Test { public: NMT_test_overwrite_back_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_overwrite_back_vm_assert_Test (NMT_test_overwrite_back_vm_assert_Test const &) = delete ; void operator=(NMT_test_overwrite_back_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_overwrite_back_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_overwrite_back_vm_assert", __null, __null, ::testing ::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 72), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_overwrite_back_vm_assert_Test >);void NMT_test_overwrite_back_vm_assert_Test::TestBody() { switch (0) case 0: default: if (::testing::internal::AlwaysTrue ()) { const ::testing::internal::RE& gtest_regex = (".*" "footer canary broken" ".*"); ::testing::internal::DeathTest* gtest_dt; if (!::testing ::internal::DeathTest::Create("child_NMT_test_overwrite_back_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 72, >est_dt)) { goto gtest_label_72; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing::internal ::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt-> AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_72; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_overwrite_back_(); }; gtest_dt ->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); break; } default: break; } } } else gtest_label_72: return :: testing::internal::AssertHelper(::testing::TestPartResult::kFatalFailure , "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 72, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_overwrite_back_() { if (MemTracker ::tracking_level() > NMT_off) { tty->print_cr("NMT overwrite death test, please ignore subsequent error dump." ); test_overwrite_back (); } else { do { if (!(false)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 72, "guarantee(" "false" ") failed", "fake message ignore this - " "footer canary broken"); ::breakpoint(); } } while (0); } } |
73 | |
74 | /////// |
75 | |
76 | // A overwrite farther away from the NMT header; the report should show the hex dump split up |
77 | // in two parts, containing both header and corruption site. |
78 | static void test_overwrite_back_long(size_t distance) { |
79 | address p = (address) os::malloc(distance, mtTest); |
80 | *(p + distance) = 'a'; |
81 | os::free(p); |
82 | } |
83 | static void test_overwrite_back_long_aligned_distance() { test_overwrite_back_long(0x2000); } |
84 | DEFINE_TEST(test_overwrite_back_long_aligned_distance, "footer canary broken")static void test_NMT_test_overwrite_back_long_aligned_distance_ (); static void child_NMT_test_overwrite_back_long_aligned_distance_ () { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_overwrite_back_long_aligned_distance_ (); exit(0); } class NMT_test_overwrite_back_long_aligned_distance_vm_assert_Test : public ::testing::Test { public: NMT_test_overwrite_back_long_aligned_distance_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_overwrite_back_long_aligned_distance_vm_assert_Test (NMT_test_overwrite_back_long_aligned_distance_vm_assert_Test const &) = delete; void operator=(NMT_test_overwrite_back_long_aligned_distance_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_overwrite_back_long_aligned_distance_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_overwrite_back_long_aligned_distance_vm_assert" , __null, __null, ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 84), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_overwrite_back_long_aligned_distance_vm_assert_Test >);void NMT_test_overwrite_back_long_aligned_distance_vm_assert_Test ::TestBody() { switch (0) case 0: default: if (::testing::internal ::AlwaysTrue()) { const ::testing::internal::RE& gtest_regex = (".*" "footer canary broken" ".*"); ::testing::internal::DeathTest * gtest_dt; if (!::testing::internal::DeathTest::Create("child_NMT_test_overwrite_back_long_aligned_distance_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 84, >est_dt)) { goto gtest_label_84; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing::internal ::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt-> AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_84; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_overwrite_back_long_aligned_distance_ (); }; gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE ); break; } default: break; } } } else gtest_label_84: return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 84, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_overwrite_back_long_aligned_distance_ () { if (MemTracker::tracking_level() > NMT_off) { tty-> print_cr("NMT overwrite death test, please ignore subsequent error dump." ); test_overwrite_back_long_aligned_distance (); } else { do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 84, "guarantee(" "false" ") failed", "fake message ignore this - " "footer canary broken"); ::breakpoint(); } } while (0); } } |
85 | static void test_overwrite_back_long_unaligned_distance() { test_overwrite_back_long(0x2001); } |
86 | DEFINE_TEST(test_overwrite_back_long_unaligned_distance, "footer canary broken")static void test_NMT_test_overwrite_back_long_unaligned_distance_ (); static void child_NMT_test_overwrite_back_long_unaligned_distance_ () { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_overwrite_back_long_unaligned_distance_ (); exit(0); } class NMT_test_overwrite_back_long_unaligned_distance_vm_assert_Test : public ::testing::Test { public: NMT_test_overwrite_back_long_unaligned_distance_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_overwrite_back_long_unaligned_distance_vm_assert_Test (NMT_test_overwrite_back_long_unaligned_distance_vm_assert_Test const &) = delete; void operator=(NMT_test_overwrite_back_long_unaligned_distance_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_overwrite_back_long_unaligned_distance_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_overwrite_back_long_unaligned_distance_vm_assert" , __null, __null, ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 86), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_overwrite_back_long_unaligned_distance_vm_assert_Test >);void NMT_test_overwrite_back_long_unaligned_distance_vm_assert_Test ::TestBody() { switch (0) case 0: default: if (::testing::internal ::AlwaysTrue()) { const ::testing::internal::RE& gtest_regex = (".*" "footer canary broken" ".*"); ::testing::internal::DeathTest * gtest_dt; if (!::testing::internal::DeathTest::Create("child_NMT_test_overwrite_back_long_unaligned_distance_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 86, >est_dt)) { goto gtest_label_86; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing::internal ::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt-> AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_86; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_overwrite_back_long_unaligned_distance_ (); }; gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE ); break; } default: break; } } } else gtest_label_86: return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 86, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_overwrite_back_long_unaligned_distance_ () { if (MemTracker::tracking_level() > NMT_off) { tty-> print_cr("NMT overwrite death test, please ignore subsequent error dump." ); test_overwrite_back_long_unaligned_distance (); } else { do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 86, "guarantee(" "false" ") failed", "fake message ignore this - " "footer canary broken"); ::breakpoint(); } } while (0); } } |
87 | |
88 | /////// |
89 | |
90 | static void test_double_free() { |
91 | address p = (address) os::malloc(1, mtTest); |
92 | os::free(p); |
93 | // Now a double free. Note that this is susceptible to concurrency issues should |
94 | // a concurrent thread have done a malloc and gotten the same address after the |
95 | // first free. To decrease chance of this happening, we repeat the double free |
96 | // several times. |
97 | for (int i = 0; i < 100; i ++) { |
98 | os::free(p); |
99 | } |
100 | } |
101 | |
102 | // What assertion message we will see depends on whether the VM wipes the memory-to-be-freed |
103 | // on the first free(), and whether the libc uses the freed memory to store bookkeeping information. |
104 | // If the death marker in the header is still intact after the first free, we will recognize this as |
105 | // double free; if it got wiped, we should at least see a broken header canary. |
106 | // The message would be either |
107 | // - "header canary broken" or |
108 | // - "header canary dead (double free?)". |
109 | // However, since gtest regex expressions do not support unions (a|b), I search for a reasonable |
110 | // subset here. |
111 | DEFINE_TEST(test_double_free, "header canary")static void test_NMT_test_double_free_(); static void child_NMT_test_double_free_ () { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_double_free_ (); exit(0); } class NMT_test_double_free_vm_assert_Test : public ::testing::Test { public: NMT_test_double_free_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_double_free_vm_assert_Test (NMT_test_double_free_vm_assert_Test const &) = delete; void operator=(NMT_test_double_free_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_double_free_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_double_free_vm_assert", __null, __null, ::testing ::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 111), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_double_free_vm_assert_Test >);void NMT_test_double_free_vm_assert_Test::TestBody() { switch (0) case 0: default: if (::testing::internal::AlwaysTrue()) { const ::testing::internal::RE& gtest_regex = (".*" "header canary" ".*"); ::testing::internal::DeathTest* gtest_dt; if (!::testing ::internal::DeathTest::Create("child_NMT_test_double_free_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 111, >est_dt)) { goto gtest_label_111; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing:: internal::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt ->AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_111; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_double_free_(); }; gtest_dt-> Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); break ; } default: break; } } } else gtest_label_111: return ::testing ::internal::AssertHelper(::testing::TestPartResult::kFatalFailure , "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 111, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_double_free_() { if (MemTracker ::tracking_level() > NMT_off) { tty->print_cr("NMT overwrite death test, please ignore subsequent error dump." ); test_double_free (); } else { do { if (!(false)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 111, "guarantee(" "false" ") failed", "fake message ignore this - " "header canary"); ::breakpoint(); } } while (0); } } |
112 | |
113 | /////// |
114 | |
115 | static void test_invalid_block_address() { |
116 | // very low, like the result of an overflow or of accessing a NULL this pointer |
117 | os::free((void*)0x100); |
118 | } |
119 | DEFINE_TEST(test_invalid_block_address, "invalid block address")static void test_NMT_test_invalid_block_address_(); static void child_NMT_test_invalid_block_address_() { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_invalid_block_address_(); exit(0); } class NMT_test_invalid_block_address_vm_assert_Test : public ::testing ::Test { public: NMT_test_invalid_block_address_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_invalid_block_address_vm_assert_Test (NMT_test_invalid_block_address_vm_assert_Test const &) = delete; void operator=(NMT_test_invalid_block_address_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_invalid_block_address_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_invalid_block_address_vm_assert", __null, __null , ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 119), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_invalid_block_address_vm_assert_Test >);void NMT_test_invalid_block_address_vm_assert_Test::TestBody () { switch (0) case 0: default: if (::testing::internal::AlwaysTrue ()) { const ::testing::internal::RE& gtest_regex = (".*" "invalid block address" ".*"); ::testing::internal::DeathTest* gtest_dt; if (!::testing ::internal::DeathTest::Create("child_NMT_test_invalid_block_address_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 119, >est_dt)) { goto gtest_label_119; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing:: internal::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt ->AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_119; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_invalid_block_address_(); }; gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE ); break; } default: break; } } } else gtest_label_119: return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 119, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_invalid_block_address_() { if (MemTracker::tracking_level() > NMT_off) { tty->print_cr ("NMT overwrite death test, please ignore subsequent error dump." ); test_invalid_block_address (); } else { do { if (!(false)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 119, "guarantee(" "false" ") failed", "fake message ignore this - " "invalid block address"); ::breakpoint(); } } while (0); } } |
120 | |
121 | /////// |
122 | |
123 | static void test_unaliged_block_address() { |
124 | address p = (address) os::malloc(1, mtTest); |
125 | os::free(p + 6); |
126 | } |
127 | DEFINE_TEST(test_unaliged_block_address, "block address is unaligned")static void test_NMT_test_unaliged_block_address_(); static void child_NMT_test_unaliged_block_address_() { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_unaliged_block_address_(); exit(0); } class NMT_test_unaliged_block_address_vm_assert_Test : public ::testing ::Test { public: NMT_test_unaliged_block_address_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_unaliged_block_address_vm_assert_Test (NMT_test_unaliged_block_address_vm_assert_Test const &) = delete; void operator=(NMT_test_unaliged_block_address_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_unaliged_block_address_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_unaliged_block_address_vm_assert", __null, __null , ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 127), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_unaliged_block_address_vm_assert_Test >);void NMT_test_unaliged_block_address_vm_assert_Test::TestBody () { switch (0) case 0: default: if (::testing::internal::AlwaysTrue ()) { const ::testing::internal::RE& gtest_regex = (".*" "block address is unaligned" ".*"); ::testing::internal::DeathTest* gtest_dt; if (!::testing ::internal::DeathTest::Create("child_NMT_test_unaliged_block_address_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 127, >est_dt)) { goto gtest_label_127; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing:: internal::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt ->AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_127; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_unaliged_block_address_(); } ; gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE ); break; } default: break; } } } else gtest_label_127: return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 127, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_unaliged_block_address_() { if (MemTracker::tracking_level() > NMT_off) { tty->print_cr ("NMT overwrite death test, please ignore subsequent error dump." ); test_unaliged_block_address (); } else { do { if (!(false) ) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 127, "guarantee(" "false" ") failed", "fake message ignore this - " "block address is unaligned"); ::breakpoint(); } } while (0) ; } }; |
128 | |
129 | /////// |
130 | |
131 | // Test that we notice block corruption on realloc too |
132 | static void test_corruption_on_realloc(size_t s1, size_t s2) { |
133 | address p1 = (address) os::malloc(s1, mtTest); |
134 | *(p1 + s1) = 'a'; |
135 | address p2 = (address) os::realloc(p1, s2, mtTest); |
Value stored to 'p2' during its initialization is never read | |
136 | |
137 | // Still here? |
138 | tty->print_cr("NMT did not detect corruption on os::realloc?"); |
139 | // Note: don't use ASSERT here, that does not work as expected in death tests. Just |
140 | // let the test run its course, it should notice something is amiss. |
141 | } |
142 | static void test_corruption_on_realloc_growing() { test_corruption_on_realloc(0x10, 0x11); } |
143 | DEFINE_TEST(test_corruption_on_realloc_growing, COMMON_NMT_HEAP_CORRUPTION_MESSAGE_PREFIX)static void test_NMT_test_corruption_on_realloc_growing_(); static void child_NMT_test_corruption_on_realloc_growing_() { ::testing ::FLAGS_gtest_throw_on_failure = true; test_NMT_test_corruption_on_realloc_growing_ (); exit(0); } class NMT_test_corruption_on_realloc_growing_vm_assert_Test : public ::testing::Test { public: NMT_test_corruption_on_realloc_growing_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_corruption_on_realloc_growing_vm_assert_Test (NMT_test_corruption_on_realloc_growing_vm_assert_Test const & ) = delete; void operator=(NMT_test_corruption_on_realloc_growing_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_corruption_on_realloc_growing_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_corruption_on_realloc_growing_vm_assert", __null , __null, ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 143), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_corruption_on_realloc_growing_vm_assert_Test >);void NMT_test_corruption_on_realloc_growing_vm_assert_Test ::TestBody() { switch (0) case 0: default: if (::testing::internal ::AlwaysTrue()) { const ::testing::internal::RE& gtest_regex = (".*" "NMT corruption" ".*"); ::testing::internal::DeathTest * gtest_dt; if (!::testing::internal::DeathTest::Create("child_NMT_test_corruption_on_realloc_growing_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 143, >est_dt)) { goto gtest_label_143; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing:: internal::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt ->AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_143; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_corruption_on_realloc_growing_ (); }; gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE ); break; } default: break; } } } else gtest_label_143: return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 143, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_corruption_on_realloc_growing_ () { if (MemTracker::tracking_level() > NMT_off) { tty-> print_cr("NMT overwrite death test, please ignore subsequent error dump." ); test_corruption_on_realloc_growing (); } else { do { if (! (false)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 143, "guarantee(" "false" ") failed", "fake message ignore this - " "NMT corruption"); ::breakpoint(); } } while (0); } }; |
144 | static void test_corruption_on_realloc_shrinking() { test_corruption_on_realloc(0x11, 0x10); } |
145 | DEFINE_TEST(test_corruption_on_realloc_shrinking, COMMON_NMT_HEAP_CORRUPTION_MESSAGE_PREFIX)static void test_NMT_test_corruption_on_realloc_shrinking_(); static void child_NMT_test_corruption_on_realloc_shrinking_( ) { ::testing::FLAGS_gtest_throw_on_failure = true; test_NMT_test_corruption_on_realloc_shrinking_ (); exit(0); } class NMT_test_corruption_on_realloc_shrinking_vm_assert_Test : public ::testing::Test { public: NMT_test_corruption_on_realloc_shrinking_vm_assert_Test () {} private: virtual void TestBody(); static ::testing::TestInfo * const test_info_ __attribute__ ((unused)); NMT_test_corruption_on_realloc_shrinking_vm_assert_Test (NMT_test_corruption_on_realloc_shrinking_vm_assert_Test const &) = delete; void operator=(NMT_test_corruption_on_realloc_shrinking_vm_assert_Test const &) = delete;};::testing::TestInfo* const NMT_test_corruption_on_realloc_shrinking_vm_assert_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_corruption_on_realloc_shrinking_vm_assert", __null , __null, ::testing::internal::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 145), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_corruption_on_realloc_shrinking_vm_assert_Test >);void NMT_test_corruption_on_realloc_shrinking_vm_assert_Test ::TestBody() { switch (0) case 0: default: if (::testing::internal ::AlwaysTrue()) { const ::testing::internal::RE& gtest_regex = (".*" "NMT corruption" ".*"); ::testing::internal::DeathTest * gtest_dt; if (!::testing::internal::DeathTest::Create("child_NMT_test_corruption_on_realloc_shrinking_()" , >est_regex, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 145, >est_dt)) { goto gtest_label_145; } if (gtest_dt != __null) { ::testing::internal::scoped_ptr< ::testing:: internal::DeathTest> gtest_dt_ptr(gtest_dt); switch (gtest_dt ->AssumeRole()) { case ::testing::internal::DeathTest::OVERSEE_TEST : if (!gtest_dt->Passed(::testing::ExitedWithCode(1)(gtest_dt ->Wait()))) { goto gtest_label_145; } break; case ::testing ::internal::DeathTest::EXECUTE_TEST: { ::testing::internal::DeathTest ::ReturnSentinel gtest_sentinel(gtest_dt); if (::testing::internal ::AlwaysTrue()) { child_NMT_test_corruption_on_realloc_shrinking_ (); }; gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE ); break; } default: break; } } } else gtest_label_145: return ::testing::internal::AssertHelper(::testing::TestPartResult:: kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 145, ::testing::internal::DeathTest::LastMessage()) = ::testing ::Message(); } void test_NMT_test_corruption_on_realloc_shrinking_ () { if (MemTracker::tracking_level() > NMT_off) { tty-> print_cr("NMT overwrite death test, please ignore subsequent error dump." ); test_corruption_on_realloc_shrinking (); } else { do { if ( !(false)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 145, "guarantee(" "false" ") failed", "fake message ignore this - " "NMT corruption"); ::breakpoint(); } } while (0); } }; |
146 | |
147 | /////// |
148 | |
149 | // realloc is the trickiest of the bunch. Test that realloc works and correctly takes over |
150 | // NMT header and footer to the resized block. We just test that nothing crashes - if the |
151 | // header/footer get corrupted, NMT heap corruption checker will trigger alert on os::free()). |
152 | TEST_VM(NMT, test_realloc)class NMT_test_realloc_vm_Test : public ::testing::Test { public : NMT_test_realloc_vm_Test() {} private: virtual void TestBody (); static ::testing::TestInfo* const test_info_ __attribute__ ((unused)); NMT_test_realloc_vm_Test(NMT_test_realloc_vm_Test const &) = delete; void operator=(NMT_test_realloc_vm_Test const &) = delete;};::testing::TestInfo* const NMT_test_realloc_vm_Test ::test_info_ = ::testing::internal::MakeAndRegisterTestInfo( "NMT", "test_realloc_vm", __null, __null, ::testing::internal ::CodeLocation("/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 152), (::testing::internal::GetTestTypeId()), ::testing::Test ::SetUpTestCase, ::testing::Test::TearDownTestCase, new ::testing ::internal::TestFactoryImpl< NMT_test_realloc_vm_Test>) ;void NMT_test_realloc_vm_Test::TestBody() { |
153 | // We test both directions (growing and shrinking) and a small range for each to cover all |
154 | // size alignment variants. Should not matter, but this should be cheap. |
155 | for (size_t s1 = 0xF0; s1 < 0x110; s1 ++) { |
156 | for (size_t s2 = 0x100; s2 > 0xF0; s2 --) { |
157 | address p1 = (address) os::malloc(s1, mtTest); |
158 | ASSERT_NOT_NULL(p1)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::CmpHelperNE("p2i(p1)", "0", p2i(p1), 0))) ; else return ::testing::internal::AssertHelper (::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 158, gtest_ar.failure_message()) = ::testing::Message(); |
159 | GtestUtils::mark_range(p1, s1); // mark payload range... |
160 | address p2 = (address) os::realloc(p1, s2, mtTest); |
161 | ASSERT_NOT_NULL(p2)switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar = (::testing::internal::CmpHelperNE("p2i(p2)", "0", p2i(p2), 0))) ; else return ::testing::internal::AssertHelper (::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 161, gtest_ar.failure_message()) = ::testing::Message(); |
162 | ASSERT_RANGE_IS_MARKED(p2, MIN2(s1, s2))switch (0) case 0: default: if (const ::testing::AssertionResult gtest_ar_ = ::testing::AssertionResult(GtestUtils::check_range (p2, MIN2(s1, s2)))) ; else return ::testing::internal::AssertHelper (::testing::TestPartResult::kFatalFailure, "/home/daniel/Projects/java/jdk/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp" , 162, ::testing::internal::GetBoolAssertionFailureMessage( gtest_ar_ , "GtestUtils::check_range(p2, MIN2(s1, s2))", "false", "true" ).c_str()) = ::testing::Message() // ... and check that it survived the resize |
163 | << s1 << "->" << s2 << std::endl; |
164 | os::free(p2); // <- if NMT headers/footers got corrupted this asserts |
165 | } |
166 | } |
167 | } |
168 | |
169 | #endif // INCLUDE_NMT |