[llvm-commits] [compiler-rt] r150414 - in /compiler-rt/trunk/lib/asan: asan_interface.h asan_internal.h asan_posix.cc asan_rtl.cc asan_win.cc tests/asan_interface_test.cc
Kostya Serebryany
kcc at google.com
Mon Feb 13 13:24:29 PST 2012
Author: kcc
Date: Mon Feb 13 15:24:29 2012
New Revision: 150414
URL: http://llvm.org/viewvc/llvm-project?rev=150414&view=rev
Log:
[asan] implement __asan_set_death_callback
Modified:
compiler-rt/trunk/lib/asan/asan_interface.h
compiler-rt/trunk/lib/asan/asan_internal.h
compiler-rt/trunk/lib/asan/asan_posix.cc
compiler-rt/trunk/lib/asan/asan_rtl.cc
compiler-rt/trunk/lib/asan/asan_win.cc
compiler-rt/trunk/lib/asan/tests/asan_interface_test.cc
Modified: compiler-rt/trunk/lib/asan/asan_interface.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interface.h?rev=150414&r1=150413&r2=150414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_interface.h (original)
+++ compiler-rt/trunk/lib/asan/asan_interface.h Mon Feb 13 15:24:29 2012
@@ -81,7 +81,7 @@
// Performs cleanup before a NoReturn function. Must be called before things
// like _exit and execl to avoid false positives on stack.
- void __asan_handle_no_return();
+ void __asan_handle_no_return() ASAN_INTERFACE_FUNCTION_ATTRIBUTE;
// User code should use macro instead of functions.
#if defined(__has_feature) && __has_feature(address_sanitizer)
@@ -109,7 +109,13 @@
// Sets the exit code to use when reporting an error.
// Returns the old value.
- int __asan_set_error_exit_code(int exit_code);
+ int __asan_set_error_exit_code(int exit_code)
+ ASAN_INTERFACE_FUNCTION_ATTRIBUTE;
+
+ // Sets the callback to be called right before death on error.
+ // Passing NULL will unset the callback.
+ void __asan_set_death_callback(void (*callback)(void))
+ ASAN_INTERFACE_FUNCTION_ATTRIBUTE;
// Returns the estimated number of bytes that will be reserved by allocator
// for request of "size" bytes. If ASan allocator can't allocate that much
Modified: compiler-rt/trunk/lib/asan/asan_internal.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_internal.h?rev=150414&r1=150413&r2=150414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_internal.h (original)
+++ compiler-rt/trunk/lib/asan/asan_internal.h Mon Feb 13 15:24:29 2012
@@ -210,6 +210,8 @@
enum LinkerInitialized { LINKER_INITIALIZED = 0 };
void AsanDie();
+void SleepForSeconds(int seconds);
+void Exit(int exitcode);
#define CHECK(cond) do { if (!(cond)) { \
CheckFailed(#cond, __FILE__, __LINE__); \
Modified: compiler-rt/trunk/lib/asan/asan_posix.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_posix.cc?rev=150414&r1=150413&r2=150414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_posix.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_posix.cc Mon Feb 13 15:24:29 2012
@@ -69,14 +69,6 @@
setrlimit(RLIMIT_CORE, &nocore);
}
-void AsanDie() {
- if (FLAG_sleep_before_dying) {
- Report("Sleeping for %d second(s)\n", FLAG_sleep_before_dying);
- sleep(FLAG_sleep_before_dying);
- }
- _exit(FLAG_exitcode);
-}
-
int GetPid() {
return getpid();
}
@@ -85,6 +77,14 @@
return (uintptr_t)pthread_self();
}
+void SleepForSeconds(int seconds) {
+ sleep(seconds);
+}
+
+void Exit(int exitcode) {
+ return _exit(exitcode);
+}
+
int AtomicInc(int *a) {
#ifdef ANDROID
return __atomic_inc(a) + 1;
Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=150414&r1=150413&r2=150414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_rtl.cc Mon Feb 13 15:24:29 2012
@@ -52,6 +52,7 @@
// -------------------------- Globals --------------------- {{{1
int asan_inited;
bool asan_init_is_running;
+static void (*death_callback)(void);
// -------------------------- Misc ---------------- {{{1
void ShowStatsAndAbort() {
@@ -100,6 +101,16 @@
return read_len;
}
+void AsanDie() {
+ if (FLAG_sleep_before_dying) {
+ Report("Sleeping for %d second(s)\n", FLAG_sleep_before_dying);
+ SleepForSeconds(FLAG_sleep_before_dying);
+ }
+ if (death_callback)
+ death_callback();
+ Exit(FLAG_exitcode);
+}
+
// ---------------------- mmap -------------------- {{{1
void OutOfMemoryMessageAndDie(const char *mem_type, size_t size) {
Report("ERROR: AddressSanitizer failed to allocate "
@@ -283,7 +294,6 @@
return old;
}
-NOINLINE ASAN_INTERFACE_ATTRIBUTE
void __asan_handle_no_return() {
int local_stack;
AsanThread *curr_thread = asanThreadRegistry().GetCurrent();
@@ -293,6 +303,10 @@
PoisonShadow(bottom, top - bottom, 0);
}
+void __asan_set_death_callback(void (*callback)(void)) {
+ death_callback = callback;
+}
+
void __asan_report_error(uintptr_t pc, uintptr_t bp, uintptr_t sp,
uintptr_t addr, bool is_write, size_t access_size) {
// Do not print more than one report, otherwise they will mix up.
Modified: compiler-rt/trunk/lib/asan/asan_win.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_win.cc?rev=150414&r1=150413&r2=150414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_win.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_win.cc Mon Feb 13 15:24:29 2012
@@ -48,7 +48,6 @@
void AsanUnmapOrDie(void *addr, size_t size) {
UNIMPLEMENTED();
}
-// }}}
// ---------------------- IO ---------------- {{{1
size_t AsanWrite(int fd, const void *buf, size_t count) {
@@ -75,7 +74,6 @@
UNIMPLEMENTED();
return -1;
}
-// }}}
// ---------------------- Stacktraces, symbols, etc. ---------------- {{{1
static AsanLock dbghelp_lock(LINKER_INITIALIZED);
@@ -156,7 +154,6 @@
}
return true;
}
-// }}}
// ---------------------- AsanLock ---------------- {{{1
enum LockState {
@@ -193,7 +190,6 @@
owner_ = LOCK_READY;
LeaveCriticalSection((LPCRITICAL_SECTION)opaque_storage_);
}
-// }}}
// ---------------------- TSD ---------------- {{{1
static bool tsd_key_inited = false;
@@ -215,7 +211,6 @@
CHECK(tsd_key_inited);
fake_tsd = tsd;
}
-// }}}
// ---------------------- Various stuff ---------------- {{{1
void *AsanDoesNotSupportStaticLinkage() {
@@ -253,15 +248,13 @@
UNIMPLEMENTED();
}
-void AsanDie() {
- // FIXME: AsanDie() should be the same on all platforms.
- if (FLAG_sleep_before_dying) {
- Report("Sleeping for %d second(s)\n", FLAG_sleep_before_dying);
- Sleep(FLAG_sleep_before_dying * 1000);
- }
- _exit(FLAG_exitcode);
+void SleepForSeconds(int seconds) {
+ Sleep(seconds * 1000);
+}
+
+void Exit(int exitcode) {
+ _exit(exitcode);
}
-// }}}
} // namespace __asan
Modified: compiler-rt/trunk/lib/asan/tests/asan_interface_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/asan_interface_test.cc?rev=150414&r1=150413&r2=150414&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/tests/asan_interface_test.cc (original)
+++ compiler-rt/trunk/lib/asan/tests/asan_interface_test.cc Mon Feb 13 15:24:29 2012
@@ -199,6 +199,16 @@
::testing::ExitedWithCode(original_exit_code), "");
}
+static void MyDeathCallback() {
+ fprintf(stderr, "MyDeathCallback\n");
+}
+
+TEST(AddressSanitizerInterface, DeathCallbackTest) {
+ __asan_set_death_callback(MyDeathCallback);
+ EXPECT_DEATH(DoDoubleFree(), "MyDeathCallback");
+ __asan_set_death_callback(NULL);
+}
+
static const char* kUseAfterPoisonErrorMessage = "use-after-poison";
#define ACCESS(ptr, offset) Ident(*(ptr + offset))
More information about the llvm-commits
mailing list