Move extra size checks behind a config flag.

This will let us turn that flag into a generic "turn on runtime checks" flag
that guards other functionality we have planned.
This commit is contained in:
David Goldblatt 2019-03-19 16:04:35 -07:00 committed by David Goldblatt
parent 7f7935cf78
commit f4d24f05e1
4 changed files with 40 additions and 22 deletions

View File

@ -1418,22 +1418,22 @@ if test "x$enable_readlinkat" = "x1" ; then
fi fi
AC_SUBST([enable_readlinkat]) AC_SUBST([enable_readlinkat])
dnl Avoid the extra size checking by default dnl Avoid extra safety checks by default
AC_ARG_ENABLE([extra-size-check], AC_ARG_ENABLE([opt-safety-checks],
[AS_HELP_STRING([--enable-extra-size-check], [AS_HELP_STRING([--enable-opt-safety-checks],
[Perform additonal size related sanity checks])], [Perform certain low-overhead checks, even in opt mode])],
[if test "x$enable_extra_size_check" = "xno" ; then [if test "x$enable_opt_safety_checks" = "xno" ; then
enable_extra_size_check="0" enable_opt_safety_checks="0"
else else
enable_extra_size_check="1" enable_opt_safety_checks="1"
fi fi
], ],
[enable_extra_size_check="0"] [enable_opt_safety_checks="0"]
) )
if test "x$enable_extra_size_check" = "x1" ; then if test "x$enable_opt_safety_checks" = "x1" ; then
AC_DEFINE([JEMALLOC_EXTRA_SIZE_CHECK], [ ]) AC_DEFINE([JEMALLOC_OPT_SAFETY_CHECKS], [ ])
fi fi
AC_SUBST([enable_extra_size_check]) AC_SUBST([enable_opt_safety_checks])
JE_COMPILABLE([a program using __builtin_unreachable], [ JE_COMPILABLE([a program using __builtin_unreachable], [
void foo (void) { void foo (void) {

View File

@ -360,7 +360,7 @@
*/ */
#undef JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE #undef JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE
/* Performs additional size-matching sanity checks when defined. */ /* Performs additional safety checks when defined. */
#undef JEMALLOC_EXTRA_SIZE_CHECK #undef JEMALLOC_OPT_SAFETY_CHECKS
#endif /* JEMALLOC_INTERNAL_DEFS_H_ */ #endif /* JEMALLOC_INTERNAL_DEFS_H_ */

View File

@ -161,6 +161,25 @@ static const bool config_log =
false false
#endif #endif
; ;
/*
* Are extra safety checks enabled; things like checking the size of sized
* deallocations, double-frees, etc.
*/
static const bool config_opt_safety_checks =
#if defined(JEMALLOC_EXTRA_SAFETY_CHECKS)
true
#elif defined(JEMALLOC_DEBUG)
/*
* This lets us only guard safety checks by one flag instead of two; fast
* checks can guard solely by config_opt_safety_checks and run in debug mode
* too.
*/
true
#else
false
#endif
;
#if defined(_WIN32) || defined(JEMALLOC_HAVE_SCHED_GETCPU) #if defined(_WIN32) || defined(JEMALLOC_HAVE_SCHED_GETCPU)
/* Currently percpu_arena depends on sched_getcpu. */ /* Currently percpu_arena depends on sched_getcpu. */
#define JEMALLOC_PERCPU_ARENA #define JEMALLOC_PERCPU_ARENA

View File

@ -101,7 +101,6 @@ tcache_alloc_small_hard(tsdn_t *tsdn, arena_t *arena, tcache_t *tcache,
} }
/* Enabled with --enable-extra-size-check. */ /* Enabled with --enable-extra-size-check. */
#ifdef JEMALLOC_EXTRA_SIZE_CHECK
static void static void
tbin_extents_lookup_size_check(tsdn_t *tsdn, cache_bin_t *tbin, szind_t binind, tbin_extents_lookup_size_check(tsdn_t *tsdn, cache_bin_t *tbin, szind_t binind,
size_t nflush, extent_t **extents){ size_t nflush, extent_t **extents){
@ -129,7 +128,6 @@ tbin_extents_lookup_size_check(tsdn_t *tsdn, cache_bin_t *tbin, szind_t binind,
abort(); abort();
} }
} }
#endif
void void
tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin, tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin,
@ -144,15 +142,16 @@ tcache_bin_flush_small(tsd_t *tsd, tcache_t *tcache, cache_bin_t *tbin,
unsigned nflush = tbin->ncached - rem; unsigned nflush = tbin->ncached - rem;
VARIABLE_ARRAY(extent_t *, item_extent, nflush); VARIABLE_ARRAY(extent_t *, item_extent, nflush);
#ifndef JEMALLOC_EXTRA_SIZE_CHECK
/* Look up extent once per item. */ /* Look up extent once per item. */
if (config_opt_safety_checks) {
tbin_extents_lookup_size_check(tsd_tsdn(tsd), tbin, binind,
nflush, item_extent);
} else {
for (unsigned i = 0 ; i < nflush; i++) { for (unsigned i = 0 ; i < nflush; i++) {
item_extent[i] = iealloc(tsd_tsdn(tsd), *(tbin->avail - 1 - i)); item_extent[i] = iealloc(tsd_tsdn(tsd),
*(tbin->avail - 1 - i));
}
} }
#else
tbin_extents_lookup_size_check(tsd_tsdn(tsd), tbin, binind, nflush,
item_extent);
#endif
while (nflush > 0) { while (nflush > 0) {
/* Lock the arena bin associated with the first object. */ /* Lock the arena bin associated with the first object. */
extent_t *extent = item_extent[0]; extent_t *extent = item_extent[0];