mirror of
https://github.com/intel/llvm.git
synced 2026-02-06 06:31:50 +08:00
[msan] Switch to common printf interceptors.
Format string parsing is disabled by default. This is not expected to meaningfully change the tool behavior. With this change, check_printf flag could be used to evaluate printf format string parsing in MSan. llvm-svn: 208295
This commit is contained in:
@@ -134,6 +134,8 @@ static void InitializeFlags(Flags *f, const char *options) {
|
||||
cf->external_symbolizer_path = GetEnv("MSAN_SYMBOLIZER_PATH");
|
||||
cf->malloc_context_size = 20;
|
||||
cf->handle_ioctl = true;
|
||||
// FIXME: test and enable.
|
||||
cf->check_printf = false;
|
||||
|
||||
internal_memset(f, 0, sizeof(*f));
|
||||
f->poison_heap_with_zeroes = false;
|
||||
|
||||
@@ -378,44 +378,7 @@ INTERCEPTOR_STRTO_BASE_LOC(long long, strtoll_l) // NOLINT
|
||||
INTERCEPTOR_STRTO_BASE_LOC(unsigned long, strtoul_l) // NOLINT
|
||||
INTERCEPTOR_STRTO_BASE_LOC(unsigned long long, strtoull_l) // NOLINT
|
||||
|
||||
INTERCEPTOR(int, vasprintf, char **strp, const char *format, va_list ap) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(vasprintf)(strp, format, ap);
|
||||
if (res >= 0 && !__msan_has_dynamic_component()) {
|
||||
__msan_unpoison(strp, sizeof(*strp));
|
||||
__msan_unpoison(*strp, res + 1);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, asprintf, char **strp, const char *format, ...) { // NOLINT
|
||||
ENSURE_MSAN_INITED();
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
int res = vasprintf(strp, format, ap); // NOLINT
|
||||
va_end(ap);
|
||||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, vsnprintf, char *str, uptr size,
|
||||
const char *format, va_list ap) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(vsnprintf)(str, size, format, ap);
|
||||
if (res >= 0 && !__msan_has_dynamic_component()) {
|
||||
__msan_unpoison(str, res + 1);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, vsprintf, char *str, const char *format, va_list ap) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(vsprintf)(str, format, ap);
|
||||
if (res >= 0 && !__msan_has_dynamic_component()) {
|
||||
__msan_unpoison(str, res + 1);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
// FIXME: support *wprintf in common format interceptors.
|
||||
INTERCEPTOR(int, vswprintf, void *str, uptr size, void *format, va_list ap) {
|
||||
ENSURE_MSAN_INITED();
|
||||
int res = REAL(vswprintf)(str, size, format, ap);
|
||||
@@ -425,24 +388,6 @@ INTERCEPTOR(int, vswprintf, void *str, uptr size, void *format, va_list ap) {
|
||||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, sprintf, char *str, const char *format, ...) { // NOLINT
|
||||
ENSURE_MSAN_INITED();
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
int res = vsprintf(str, format, ap); // NOLINT
|
||||
va_end(ap);
|
||||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, snprintf, char *str, uptr size, const char *format, ...) {
|
||||
ENSURE_MSAN_INITED();
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
int res = vsnprintf(str, size, format, ap);
|
||||
va_end(ap);
|
||||
return res;
|
||||
}
|
||||
|
||||
INTERCEPTOR(int, swprintf, void *str, uptr size, void *format, ...) {
|
||||
ENSURE_MSAN_INITED();
|
||||
va_list ap;
|
||||
@@ -1270,8 +1215,6 @@ int OnExit() {
|
||||
} while (false) // FIXME
|
||||
#define COMMON_INTERCEPTOR_BLOCK_REAL(name) REAL(name)
|
||||
#define COMMON_INTERCEPTOR_ON_EXIT(ctx) OnExit()
|
||||
// FIXME: update Msan to use common printf interceptors
|
||||
#define SANITIZER_INTERCEPT_PRINTF 0
|
||||
#include "sanitizer_common/sanitizer_common_interceptors.inc"
|
||||
|
||||
#define COMMON_SYSCALL_PRE_READ_RANGE(p, s) CHECK_UNPOISONED(p, s)
|
||||
@@ -1552,13 +1495,7 @@ void InitializeInterceptors() {
|
||||
INTERCEPT_FUNCTION(strtoll_l);
|
||||
INTERCEPT_FUNCTION(strtoul_l);
|
||||
INTERCEPT_FUNCTION(strtoull_l);
|
||||
INTERCEPT_FUNCTION(vasprintf);
|
||||
INTERCEPT_FUNCTION(asprintf);
|
||||
INTERCEPT_FUNCTION(vsprintf);
|
||||
INTERCEPT_FUNCTION(vsnprintf);
|
||||
INTERCEPT_FUNCTION(vswprintf);
|
||||
INTERCEPT_FUNCTION(sprintf); // NOLINT
|
||||
INTERCEPT_FUNCTION(snprintf);
|
||||
INTERCEPT_FUNCTION(swprintf);
|
||||
INTERCEPT_FUNCTION(strftime);
|
||||
INTERCEPT_FUNCTION(strftime_l);
|
||||
|
||||
Reference in New Issue
Block a user