summaryrefslogtreecommitdiff
path: root/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2018-03-07 13:38:48 -0800
committerChristopher Ferris <cferris@google.com>2018-04-02 18:59:23 -0700
commit4da2503d70dc4bc1444454876e3794b69227d90d (patch)
treed904c750ebac96aee76df44baad1320c0db211a3 /libc/malloc_debug/tests/malloc_debug_config_tests.cpp
parenta3f6f6c1b9135c90e410f5382b153db9a43a4db0 (diff)
Refactor malloc debug.
Changes - Refactor the code so that only guards require creating a special header for every pointer allocated. - Store only a single copy of every backtrace. This saves memory so that turning on the backtrace option doesn't result in 10X memory usage. - Added new option track_allocs that only verifies pointers are valid for free/malloc_usable_size/realloc. - Remove suffix from test names. - Add the TRACK_ALLOCS options to all guard options. - Add new option verify_pointers that is a lightweight way to verify pointers that are passed to allocation routines. - Do auto-formatting of the code. - Updated documentation for all of these changes. Bug: 74361929 Test: Ran unit tests. Test: Ran libmemunreachable unit tests. Test: Ran an app with backtrace enabled. Change-Id: I3246c48ae4f9811f64622d90d0a9b4d9d818702c
Diffstat (limited to 'libc/malloc_debug/tests/malloc_debug_config_tests.cpp')
-rw-r--r--libc/malloc_debug/tests/malloc_debug_config_tests.cpp52
1 files changed, 37 insertions, 15 deletions
diff --git a/libc/malloc_debug/tests/malloc_debug_config_tests.cpp b/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
index ee8fe0691..460353583 100644
--- a/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
+++ b/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
@@ -135,6 +135,10 @@ std::string usage_string(
"6 malloc_debug This option only has meaning if the record_allocs options has been specified.\n"
"6 malloc_debug This is the name of the file to which recording information will be dumped.\n"
"6 malloc_debug The default is /data/local/tmp/record_allocs.txt.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug verify_pointers\n"
+ "6 malloc_debug A lightweight way to verify that free/malloc_usable_size/realloc\n"
+ "6 malloc_debug are passed valid pointers.\n"
);
TEST_F(MallocDebugConfigTest, unknown_option) {
@@ -250,15 +254,15 @@ TEST_F(MallocDebugConfigTest, multiple_options) {
TEST_F(MallocDebugConfigTest, front_guard) {
ASSERT_TRUE(InitConfig("front_guard=48")) << getFakeLogPrint();
- ASSERT_EQ(FRONT_GUARD, config->options());
+ ASSERT_EQ(FRONT_GUARD | TRACK_ALLOCS, config->options());
ASSERT_EQ(48U, config->front_guard_bytes());
ASSERT_TRUE(InitConfig("front_guard")) << getFakeLogPrint();
- ASSERT_EQ(FRONT_GUARD, config->options());
+ ASSERT_EQ(FRONT_GUARD | TRACK_ALLOCS, config->options());
ASSERT_EQ(32U, config->front_guard_bytes());
ASSERT_TRUE(InitConfig("front_guard=39")) << getFakeLogPrint();
- ASSERT_EQ(FRONT_GUARD, config->options());
+ ASSERT_EQ(FRONT_GUARD | TRACK_ALLOCS, config->options());
#if defined(__LP64__)
ASSERT_EQ(48U, config->front_guard_bytes());
#else
@@ -266,7 +270,7 @@ TEST_F(MallocDebugConfigTest, front_guard) {
#endif
ASSERT_TRUE(InitConfig("front_guard=41")) << getFakeLogPrint();
- ASSERT_EQ(FRONT_GUARD, config->options());
+ ASSERT_EQ(FRONT_GUARD | TRACK_ALLOCS, config->options());
ASSERT_EQ(48U, config->front_guard_bytes());
ASSERT_STREQ("", getFakeLogBuf().c_str());
@@ -275,11 +279,11 @@ TEST_F(MallocDebugConfigTest, front_guard) {
TEST_F(MallocDebugConfigTest, rear_guard) {
ASSERT_TRUE(InitConfig("rear_guard=50")) << getFakeLogPrint();
- ASSERT_EQ(REAR_GUARD, config->options());
+ ASSERT_EQ(REAR_GUARD | TRACK_ALLOCS, config->options());
ASSERT_EQ(50U, config->rear_guard_bytes());
ASSERT_TRUE(InitConfig("rear_guard")) << getFakeLogPrint();
- ASSERT_EQ(REAR_GUARD, config->options());
+ ASSERT_EQ(REAR_GUARD | TRACK_ALLOCS, config->options());
ASSERT_EQ(32U, config->rear_guard_bytes());
ASSERT_STREQ("", getFakeLogBuf().c_str());
@@ -288,12 +292,12 @@ TEST_F(MallocDebugConfigTest, rear_guard) {
TEST_F(MallocDebugConfigTest, guard) {
ASSERT_TRUE(InitConfig("guard=32")) << getFakeLogPrint();
- ASSERT_EQ(FRONT_GUARD | REAR_GUARD, config->options());
+ ASSERT_EQ(FRONT_GUARD | REAR_GUARD | TRACK_ALLOCS, config->options());
ASSERT_EQ(32U, config->front_guard_bytes());
ASSERT_EQ(32U, config->rear_guard_bytes());
ASSERT_TRUE(InitConfig("guard")) << getFakeLogPrint();
- ASSERT_EQ(FRONT_GUARD | REAR_GUARD, config->options());
+ ASSERT_EQ(FRONT_GUARD | REAR_GUARD | TRACK_ALLOCS, config->options());
ASSERT_EQ(32U, config->front_guard_bytes());
ASSERT_EQ(32U, config->rear_guard_bytes());
@@ -465,13 +469,13 @@ TEST_F(MallocDebugConfigTest, expand_alloc) {
TEST_F(MallocDebugConfigTest, free_track) {
ASSERT_TRUE(InitConfig("free_track=1234")) << getFakeLogPrint();
- ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options());
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, config->options());
ASSERT_EQ(1234U, config->free_track_allocations());
ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes());
ASSERT_EQ(16U, config->free_track_backtrace_num_frames());
ASSERT_TRUE(InitConfig("free_track")) << getFakeLogPrint();
- ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options());
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, config->options());
ASSERT_EQ(100U, config->free_track_allocations());
ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes());
ASSERT_EQ(16U, config->free_track_backtrace_num_frames());
@@ -482,20 +486,20 @@ TEST_F(MallocDebugConfigTest, free_track) {
TEST_F(MallocDebugConfigTest, free_track_and_fill_on_free) {
ASSERT_TRUE(InitConfig("free_track=1234 fill_on_free=32")) << getFakeLogPrint();
- ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options());
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, config->options());
ASSERT_EQ(1234U, config->free_track_allocations());
ASSERT_EQ(32U, config->fill_on_free_bytes());
ASSERT_EQ(16U, config->free_track_backtrace_num_frames());
ASSERT_TRUE(InitConfig("free_track fill_on_free=60")) << getFakeLogPrint();
- ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options());
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, config->options());
ASSERT_EQ(100U, config->free_track_allocations());
ASSERT_EQ(60U, config->fill_on_free_bytes());
ASSERT_EQ(16U, config->free_track_backtrace_num_frames());
// Now reverse the arguments.
ASSERT_TRUE(InitConfig("fill_on_free=32 free_track=1234")) << getFakeLogPrint();
- ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options());
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, config->options());
ASSERT_EQ(1234U, config->free_track_allocations());
ASSERT_EQ(32U, config->fill_on_free_bytes());
ASSERT_EQ(16U, config->free_track_backtrace_num_frames());
@@ -530,11 +534,11 @@ TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames_zero) {
TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames_and_free_track) {
ASSERT_TRUE(InitConfig("free_track free_track_backtrace_num_frames=123")) << getFakeLogPrint();
- ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options());
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, config->options());
ASSERT_EQ(123U, config->free_track_backtrace_num_frames());
ASSERT_TRUE(InitConfig("free_track free_track_backtrace_num_frames")) << getFakeLogPrint();
- ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options());
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, config->options());
ASSERT_EQ(16U, config->free_track_backtrace_num_frames());
ASSERT_STREQ("", getFakeLogBuf().c_str());
@@ -559,6 +563,24 @@ TEST_F(MallocDebugConfigTest, leak_track_fail) {
ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
}
+TEST_F(MallocDebugConfigTest, verify_pointers) {
+ ASSERT_TRUE(InitConfig("verify_pointers")) << getFakeLogPrint();
+ ASSERT_EQ(TRACK_ALLOCS, config->options());
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, verify_pointers_fail) {
+ ASSERT_FALSE(InitConfig("verify_pointers=200")) << getFakeLogPrint();
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: value set for option 'verify_pointers' "
+ "which does not take a value\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
TEST_F(MallocDebugConfigTest, record_allocs) {
ASSERT_TRUE(InitConfig("record_allocs=1234")) << getFakeLogPrint();
ASSERT_EQ(RECORD_ALLOCS, config->options());