Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -1241,7 +1241,8 @@ // libc file streams can call user-supplied functions, see fopencookie. void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, fputs, s, file); - COMMON_INTERCEPTOR_READ_RANGE(ctx, s, REAL(strlen)(s) + 1); + if (!SANITIZER_MAC || s) + COMMON_INTERCEPTOR_READ_RANGE(ctx, s, REAL(strlen)(s) + 1); return REAL(fputs)(s, file); } #define INIT_FPUTS COMMON_INTERCEPT_FUNCTION(fputs) @@ -1254,7 +1255,8 @@ // libc file streams can call user-supplied functions, see fopencookie. void *ctx; COMMON_INTERCEPTOR_ENTER(ctx, puts, s); - COMMON_INTERCEPTOR_READ_RANGE(ctx, s, REAL(strlen)(s) + 1); + if (!SANITIZER_MAC || s) + COMMON_INTERCEPTOR_READ_RANGE(ctx, s, REAL(strlen)(s) + 1); return REAL(puts)(s); } #define INIT_PUTS COMMON_INTERCEPT_FUNCTION(puts) Index: compiler-rt/trunk/test/sanitizer_common/TestCases/Darwin/fputs_puts_null.cc =================================================================== --- compiler-rt/trunk/test/sanitizer_common/TestCases/Darwin/fputs_puts_null.cc +++ compiler-rt/trunk/test/sanitizer_common/TestCases/Darwin/fputs_puts_null.cc @@ -0,0 +1,16 @@ +// On Darwin, the man page states that "both fputs() and puts() print `(null)' +// if str is NULL." +// +// RUN: %clangxx -g %s -o %t && %run %t | FileCheck %s +// CHECK: {{^\(null\)---\(null\)$}} + +#include +#include + +int main(void) { + assert(fputs(NULL, stdout) >= 0); + fputs("---", stdout); + assert(puts(NULL) >= 0); + + return 0; +}