tsan: ignore malloc/free/strdup when called from libjvm

llvm-svn: 191153
This commit is contained in:
Dmitry Vyukov 2013-09-21 23:44:19 +00:00
parent 150406bbf3
commit 76ec1910ac
3 changed files with 27 additions and 7 deletions

View File

@ -444,7 +444,7 @@ TSAN_INTERCEPTOR(void, siglongjmp, uptr *env, int val) {
}
TSAN_INTERCEPTOR(void*, malloc, uptr size) {
if (cur_thread()->in_symbolizer)
if (cur_thread()->in_symbolizer || libjvm_check(GET_CALLER_PC()))
return __libc_malloc(size);
void *p = 0;
{
@ -461,7 +461,7 @@ TSAN_INTERCEPTOR(void*, __libc_memalign, uptr align, uptr sz) {
}
TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) {
if (cur_thread()->in_symbolizer)
if (cur_thread()->in_symbolizer || libjvm_check(GET_CALLER_PC()))
return __libc_calloc(size, n);
if (__sanitizer::CallocShouldReturnNullDueToOverflow(size, n))
return AllocatorReturnNull();
@ -477,7 +477,7 @@ TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) {
}
TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) {
if (cur_thread()->in_symbolizer)
if (cur_thread()->in_symbolizer || libjvm_check(GET_CALLER_PC()))
return __libc_realloc(p, size);
if (p)
invoke_free_hook(p);
@ -492,7 +492,7 @@ TSAN_INTERCEPTOR(void*, realloc, void *p, uptr size) {
TSAN_INTERCEPTOR(void, free, void *p) {
if (p == 0)
return;
if (cur_thread()->in_symbolizer)
if (cur_thread()->in_symbolizer || libjvm_check(GET_CALLER_PC()))
return __libc_free(p);
invoke_free_hook(p);
SCOPED_INTERCEPTOR_RAW(free, p);
@ -502,7 +502,7 @@ TSAN_INTERCEPTOR(void, free, void *p) {
TSAN_INTERCEPTOR(void, cfree, void *p) {
if (p == 0)
return;
if (cur_thread()->in_symbolizer)
if (cur_thread()->in_symbolizer || libjvm_check(GET_CALLER_PC()))
return __libc_free(p);
invoke_free_hook(p);
SCOPED_INTERCEPTOR_RAW(cfree, p);
@ -511,11 +511,13 @@ TSAN_INTERCEPTOR(void, cfree, void *p) {
TSAN_INTERCEPTOR(uptr, malloc_usable_size, void *p) {
SCOPED_INTERCEPTOR_RAW(malloc_usable_size, p);
if (libjvm_check(pc))
return malloc_usable_size(p);
return user_alloc_usable_size(thr, pc, p);
}
#define OPERATOR_NEW_BODY(mangled_name) \
if (cur_thread()->in_symbolizer) \
if (cur_thread()->in_symbolizer || libjvm_check(GET_CALLER_PC())) \
return __libc_malloc(size); \
void *p = 0; \
{ \
@ -551,7 +553,7 @@ void *operator new[](__sanitizer::uptr size, std::nothrow_t const&) {
#define OPERATOR_DELETE_BODY(mangled_name) \
if (ptr == 0) return; \
if (cur_thread()->in_symbolizer) \
if (cur_thread()->in_symbolizer || libjvm_check(GET_CALLER_PC())) \
return __libc_free(ptr); \
invoke_free_hook(ptr); \
SCOPED_INTERCEPTOR_RAW(mangled_name, ptr); \
@ -683,6 +685,21 @@ TSAN_INTERCEPTOR(const char*, strstr, const char *s1, const char *s2) {
return res;
}
TSAN_INTERCEPTOR(char*, strdup, const char *str) {
SCOPED_TSAN_INTERCEPTOR(strdup, str);
if (libjvm_check(pc)) {
// The memory must come from libc malloc,
// and we must not instrument accesses in this case.
uptr n = internal_strlen(str) + 1;
void *p = __libc_malloc(n);
if (p == 0)
return 0;
return (char*)internal_memcpy(p, str, n);
}
// strdup will call malloc, so no instrumentation is required here.
return REAL(strdup)(str);
}
static bool fix_mmap_addr(void **addr, long_t sz, int flags) {
if (*addr) {
if (!IsAppMem((uptr)*addr) || !IsAppMem((uptr)*addr + sz - 1)) {
@ -2037,6 +2054,7 @@ void InitializeInterceptors() {
TSAN_INTERCEPT(strcpy); // NOLINT
TSAN_INTERCEPT(strncpy);
TSAN_INTERCEPT(strstr);
TSAN_INTERCEPT(strdup);
TSAN_INTERCEPT(pthread_create);
TSAN_INTERCEPT(pthread_join);

View File

@ -138,6 +138,7 @@ void StatOutput(u64 *stat) {
name[StatInt_strcpy] = " strcpy ";
name[StatInt_strncpy] = " strncpy ";
name[StatInt_strstr] = " strstr ";
name[StatInt_strdup] = " strdup ";
name[StatInt_strcasecmp] = " strcasecmp ";
name[StatInt_strncasecmp] = " strncasecmp ";
name[StatInt_atexit] = " atexit ";

View File

@ -137,6 +137,7 @@ enum StatType {
StatInt_strcasecmp,
StatInt_strncasecmp,
StatInt_strstr,
StatInt_strdup,
StatInt_atexit,
StatInt___cxa_guard_acquire,
StatInt___cxa_guard_release,