diff options
-rw-r--r-- | lib/msan/lit_tests/times.cc | 20 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_common_interceptors.inc | 15 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_interceptors.h | 1 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_limits_posix.cc | 2 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_limits_posix.h | 2 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_stat.cc | 1 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_stat.h | 1 |
7 files changed, 42 insertions, 0 deletions
diff --git a/lib/msan/lit_tests/times.cc b/lib/msan/lit_tests/times.cc new file mode 100644 index 000000000..1b7d00052 --- /dev/null +++ b/lib/msan/lit_tests/times.cc @@ -0,0 +1,20 @@ +// RUN: %clangxx_msan -m64 -O0 -g %s -o %t && %t + +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/times.h> + + +int main(void) { + struct tms t; + clock_t res = times(&t); + assert(res != (clock_t)-1); + + if (t.tms_utime) printf("1\n"); + if (t.tms_stime) printf("2\n"); + if (t.tms_cutime) printf("3\n"); + if (t.tms_cstime) printf("4\n"); + + return 0; +} diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index 61bc06cf5..3af97f902 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -2878,6 +2878,20 @@ INTERCEPTOR(SIZE_T, iconv, void *cd, char **inbuf, SIZE_T *inbytesleft, #define INIT_ICONV #endif +#if SANITIZER_INTERCEPT_TIMES +INTERCEPTOR(__sanitizer_clock_t, times, void *tms) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, times, tms); + __sanitizer_clock_t res = REAL(times)(tms); + if (res != (__sanitizer_clock_t)-1 && tms) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tms, struct_tms_sz); + return res; +} +#define INIT_TIMES COMMON_INTERCEPT_FUNCTION(times); +#else +#define INIT_TIMES +#endif + #define SANITIZER_COMMON_INTERCEPTORS_INIT \ INIT_STRCMP; \ INIT_STRNCMP; \ @@ -2989,4 +3003,5 @@ INTERCEPTOR(SIZE_T, iconv, void *cd, char **inbuf, SIZE_T *inbytesleft, INIT_DRAND48_R; \ INIT_GETLINE; \ INIT_ICONV; \ + INIT_TIMES; \ /**/ diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h index 0db69021d..33a51b2e6 100644 --- a/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -159,6 +159,7 @@ # define SANITIZER_INTERCEPT_LGAMMA_R SI_LINUX # define SANITIZER_INTERCEPT_DRAND48_R SI_LINUX_NOT_ANDROID # define SANITIZER_INTERCEPT_ICONV SI_MAC || SI_LINUX_NOT_ANDROID +# define SANITIZER_INTERCEPT_TIMES SI_NOT_WINDOWS // FIXME: getline seems to be available on OSX 10.7 # define SANITIZER_INTERCEPT_GETLINE SI_LINUX_NOT_ANDROID diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc index 341ee59df..e2fb94fc6 100644 --- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc +++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc @@ -939,4 +939,6 @@ CHECK_SIZE_AND_OFFSET(shmid_ds, shm_lpid); CHECK_SIZE_AND_OFFSET(shmid_ds, shm_nattch); #endif +CHECK_TYPE_SIZE(clock_t); + #endif // SANITIZER_LINUX || SANITIZER_MAC diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h index 3c4e14743..26df301f3 100644 --- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -287,6 +287,8 @@ namespace __sanitizer { }; #endif + typedef long __sanitizer_clock_t; + #if SANITIZER_LINUX #if defined(_LP64) || defined(__x86_64__) typedef unsigned __sanitizer___kernel_uid_t; diff --git a/lib/tsan/rtl/tsan_stat.cc b/lib/tsan/rtl/tsan_stat.cc index 256ae835a..d23de43b9 100644 --- a/lib/tsan/rtl/tsan_stat.cc +++ b/lib/tsan/rtl/tsan_stat.cc @@ -417,6 +417,7 @@ void StatOutput(u64 *stat) { name[StatInt_getline] = " getline "; name[StatInt_getdelim] = " getdelim "; name[StatInt_iconv] = " iconv "; + name[StatInt_times] = " times "; name[StatInt_pthread_attr_getdetachstate] = " pthread_addr_getdetachstate "; // NOLINT name[StatInt_pthread_attr_getguardsize] = " pthread_addr_getguardsize "; // NOLINT diff --git a/lib/tsan/rtl/tsan_stat.h b/lib/tsan/rtl/tsan_stat.h index afb3c22d6..21196c3b4 100644 --- a/lib/tsan/rtl/tsan_stat.h +++ b/lib/tsan/rtl/tsan_stat.h @@ -412,6 +412,7 @@ enum StatType { StatInt_getline, StatInt_getdelim, StatInt_iconv, + StatInt_times, StatInt_pthread_attr_getdetachstate, StatInt_pthread_attr_getguardsize, |