[compiler-rt] r197806 - [msan] Wrap indirect calls to REAL(x) in interceptors.
Kostya Serebryany
kcc at google.com
Fri Dec 20 04:28:45 PST 2013
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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131220/46a8790d/attachment.html>
More information about the llvm-commits
mailing list