forked from OSchip/llvm-project
[ASan] Support `{f}puts(NULL)` on Darwin
On Darwin, the man page states that "both fputs() and puts() print `(null)' if str is NULL." rdar://48227136 Reviewed By: Lekensteyn Differential Revision: https://reviews.llvm.org/D64773 llvm-svn: 366342
This commit is contained in:
parent
aa5cdafa40
commit
9a050f92bb
|
@ -1241,7 +1241,8 @@ INTERCEPTOR_WITH_SUFFIX(int, fputs, char *s, void *file) {
|
|||
// 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 @@ INTERCEPTOR(int, puts, char *s) {
|
|||
// 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)
|
||||
|
|
|
@ -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 <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
assert(fputs(NULL, stdout) >= 0);
|
||||
fputs("---", stdout);
|
||||
assert(puts(NULL) >= 0);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue