[compiler-rt] r197806 - [msan] Wrap indirect calls to REAL(x) in interceptors.
Evgeniy Stepanov
eugeni.stepanov at gmail.com
Fri Dec 20 04:44:31 PST 2013
Thanks! Will fix in a moment.
On Fri, Dec 20, 2013 at 4:28 PM, Kostya Serebryany <kcc at google.com> wrote:
>
>
>
> On Fri, Dec 20, 2013 at 4:20 PM, Evgeniy Stepanov
> <eugeni.stepanov at gmail.com> wrote:
>>
>> Author: eugenis
>> Date: Fri Dec 20 06:20:15 2013
>> New Revision: 197806
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=197806&view=rev
>> Log:
>> [msan] Wrap indirect calls to REAL(x) in interceptors.
>>
>> Added:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_interception.h
>> (with props)
>> Modified:
>> compiler-rt/trunk/lib/interception/interception_linux.h
>> compiler-rt/trunk/lib/msan/lit_tests/wrap_indirect_calls_in_rtl.cc
>> compiler-rt/trunk/lib/msan/msan_interceptors.cc
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
>>
>> Modified: compiler-rt/trunk/lib/interception/interception_linux.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/interception/interception_linux.h?rev=197806&r1=197805&r2=197806&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/interception/interception_linux.h (original)
>> +++ compiler-rt/trunk/lib/interception/interception_linux.h Fri Dec 20
>> 06:20:15 2013
>> @@ -28,11 +28,11 @@ bool GetRealFunctionAddress(const char *
>> void *GetFuncAddrVer(const char *func_name, const char *ver);
>> } // namespace __interception
>>
>> -#define INTERCEPT_FUNCTION_LINUX(func) \
>> - ::__interception::GetRealFunctionAddress( \
>> - #func, (::__interception::uptr*)&REAL(func), \
>> - (::__interception::uptr)&(func), \
>> - (::__interception::uptr)&WRAP(func))
>> +#define INTERCEPT_FUNCTION_LINUX(func)
>> \
>> + ::__interception::GetRealFunctionAddress(
>> \
>> + #func, (::__interception::uptr
>> *)&__interception::PTR_TO_REAL(func), \
>> + (::__interception::uptr) & (func),
>> \
>> + (::__interception::uptr) & WRAP(func))
>>
>> #if !defined(__ANDROID__) // android does not have dlvsym
>> # define INTERCEPT_FUNCTION_VER_LINUX(func, symver) \
>>
>> Modified:
>> compiler-rt/trunk/lib/msan/lit_tests/wrap_indirect_calls_in_rtl.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/lit_tests/wrap_indirect_calls_in_rtl.cc?rev=197806&r1=197805&r2=197806&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/msan/lit_tests/wrap_indirect_calls_in_rtl.cc
>> (original)
>> +++ compiler-rt/trunk/lib/msan/lit_tests/wrap_indirect_calls_in_rtl.cc Fri
>> Dec 20 06:20:15 2013
>> @@ -3,13 +3,15 @@
>> // RUN: %clangxx_msan -O0 -g -rdynamic %s -o %t && %t
>>
>> #include <assert.h>
>> +#include <math.h>
>> #include <pthread.h>
>> #include <stdio.h>
>> #include <stdint.h>
>> +#include <sys/time.h>
>>
>> extern "C" void __msan_set_indirect_call_wrapper(uintptr_t);
>>
>> -bool done;
>> +bool pthread_create_done;
>>
>> void *ThreadFn(void *) {
>> printf("bad threadfn\n");
>> @@ -18,24 +20,61 @@ void *ThreadFn(void *) {
>>
>> void *ThreadFn2(void *) {
>> printf("good threadfn\n");
>> - done = true;
>> + pthread_create_done = true;
>> return 0;
>> }
>>
>> -// ThreadFn is called indirectly from a wrapper function in MSan rtl and
>> -// is subject to indirect call wrapping (it could be an
>> native-to-translated
>> -// edge).
>> +bool in_gettimeofday;
>> +bool in_lgamma;
>> +
>> +int my_gettimeofday(struct timeval *p, void *q) {
>> + p->tv_sec = 1;
>> + p->tv_usec = 2;
>> + return 42;
>> +}
>> +
>> +double my_lgamma(double x) {
>> + printf("zzz\n");
>> + return x;
>> +}
>> +
>> extern "C" uintptr_t my_wrapper(uintptr_t f) {
>> if (f == (uintptr_t)ThreadFn)
>> return (uintptr_t)&ThreadFn2;
>> + if (in_gettimeofday)
>> + return (uintptr_t)my_gettimeofday;
>> + if (in_lgamma)
>> + return (uintptr_t)my_lgamma;
>> return f;
>> }
>>
>> int main(void) {
>> __msan_set_indirect_call_wrapper((uintptr_t)my_wrapper);
>> +
>> + // ThreadFn is called indirectly from a wrapper function in MSan rtl
>> and
>> + // is subject to indirect call wrapping (it could be an
>> native-to-translated
>> + // edge).
>> pthread_t t;
>> pthread_create(&t, 0, ThreadFn, 0);
>> pthread_join(t, 0);
>> - assert(done);
>> + assert(pthread_create_done);
>> +
>> + // gettimeofday is intercepted in msan_interceptors.cc and the real one
>> (from
>> + // libc) is called indirectly.
>> + struct timeval tv;
>> + in_gettimeofday = true;
>> + int res = gettimeofday(&tv, NULL);
>> + in_gettimeofday = false;
>> + assert(tv.tv_sec == 1);
>> + assert(tv.tv_usec == 2);
>> + assert(res == 42);
>> +
>> + // lgamma is intercepted in sanitizer_common_interceptors.inc and is
>> also
>> + // called indirectly.
>> + in_lgamma = true;
>> + double dres = lgamma(1.1);
>> + in_lgamma = false;
>> + assert(dres == 1.1);
>> +
>> return 0;
>> }
>>
>> Modified: compiler-rt/trunk/lib/msan/msan_interceptors.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan_interceptors.cc?rev=197806&r1=197805&r2=197806&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/msan/msan_interceptors.cc (original)
>> +++ compiler-rt/trunk/lib/msan/msan_interceptors.cc Fri Dec 20 06:20:15
>> 2013
>> @@ -15,13 +15,13 @@
>> // sanitizer_common/sanitizer_common_interceptors.h
>>
>> //===----------------------------------------------------------------------===//
>>
>> -#include "interception/interception.h"
>> #include "msan.h"
>> #include "sanitizer_common/sanitizer_platform_limits_posix.h"
>> #include "sanitizer_common/sanitizer_allocator.h"
>> #include "sanitizer_common/sanitizer_allocator_internal.h"
>> #include "sanitizer_common/sanitizer_atomic.h"
>> #include "sanitizer_common/sanitizer_common.h"
>> +#include "sanitizer_common/sanitizer_interception.h"
>> #include "sanitizer_common/sanitizer_stackdepot.h"
>> #include "sanitizer_common/sanitizer_libc.h"
>> #include "sanitizer_common/sanitizer_linux.h"
>>
>> Added: compiler-rt/trunk/lib/sanitizer_common/sanitizer_interception.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_interception.h?rev=197806&view=auto
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_interception.h
>> (added)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_interception.h Fri
>> Dec 20 06:20:15 2013
>> @@ -0,0 +1,24 @@
>> +//===-- sanitizer_interception.h --------------------------------*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// zzz
>
>
>
> missing comment?
>
>>
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +#ifndef SANITIZER_INTERCEPTION_H
>> +#define SANITIZER_INTERCEPTION_H
>> +
>> +#include "interception/interception.h"
>> +#include "sanitizer_common.h"
>> +
>> +#if SANITIZER_LINUX && !defined(SANITIZER_GO)
>> +#undef REAL
>> +#define REAL(x) IndirectExternCall(__interception::PTR_TO_REAL(x))
>> +#endif
>> +
>> +#endif // SANITIZER_INTERCEPTION_H
>>
>> Propchange:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_interception.h
>>
>> ------------------------------------------------------------------------------
>> svn:eol-style = LF
>>
>> Modified:
>> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc?rev=197806&r1=197805&r2=197806&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
>> (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc Fri
>> Dec 20 06:20:15 2013
>> @@ -357,6 +357,8 @@ uptr GetListOfModules(LoadedModule *modu
>> uptr indirect_call_wrapper;
>>
>> void SetIndirectCallWrapper(uptr wrapper) {
>> + CHECK(!indirect_call_wrapper);
>> + CHECK(wrapper);
>> indirect_call_wrapper = wrapper;
>> }
>> #endif
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
More information about the llvm-commits
mailing list