Add sized-delete size-checking functionality.

The existing checks are good at finding such issues (on tcache flush), but not
so good at pinpointing them.  Debug mode can find them, but sometimes debug mode
slows down a program so much that hard-to-hit bugs can take a long time to
crash.

This commit adds functionality to keep programs mostly on their fast paths,
while also checking every sized delete argument they get.
This commit is contained in:
David Goldblatt
2020-08-03 18:23:36 -07:00
committed by David Goldblatt
parent 53084cc5c2
commit eaed1e39be
6 changed files with 135 additions and 9 deletions

62
test/unit/size_check.c Normal file
View File

@@ -0,0 +1,62 @@
#include "test/jemalloc_test.h"
#include "jemalloc/internal/safety_check.h"
bool fake_abort_called;
void fake_abort(const char *message) {
(void)message;
fake_abort_called = true;
}
#define SIZE1 SC_SMALL_MAXCLASS
#define SIZE2 (SC_SMALL_MAXCLASS / 2)
TEST_BEGIN(test_invalid_size_sdallocx) {
test_skip_if(!config_opt_size_checks);
safety_check_set_abort(&fake_abort);
fake_abort_called = false;
void *ptr = malloc(SIZE1);
assert_ptr_not_null(ptr, "Unexpected failure");
sdallocx(ptr, SIZE2, 0);
expect_true(fake_abort_called, "Safety check didn't fire");
safety_check_set_abort(NULL);
}
TEST_END
TEST_BEGIN(test_invalid_size_sdallocx_nonzero_flag) {
test_skip_if(!config_opt_size_checks);
safety_check_set_abort(&fake_abort);
fake_abort_called = false;
void *ptr = malloc(SIZE1);
assert_ptr_not_null(ptr, "Unexpected failure");
sdallocx(ptr, SIZE2, MALLOCX_TCACHE_NONE);
expect_true(fake_abort_called, "Safety check didn't fire");
safety_check_set_abort(NULL);
}
TEST_END
TEST_BEGIN(test_invalid_size_sdallocx_noflags) {
test_skip_if(!config_opt_size_checks);
safety_check_set_abort(&fake_abort);
fake_abort_called = false;
void *ptr = malloc(SIZE1);
assert_ptr_not_null(ptr, "Unexpected failure");
je_sdallocx_noflags(ptr, SIZE2);
expect_true(fake_abort_called, "Safety check didn't fire");
safety_check_set_abort(NULL);
}
TEST_END
int
main(void) {
return test(
test_invalid_size_sdallocx,
test_invalid_size_sdallocx_nonzero_flag,
test_invalid_size_sdallocx_noflags);
}