[TTC-9] Make LSan compliant with recovery mode when running on top of ASan 63/150163/4
authorSlava Barinov <v.barinov@samsung.com>
Thu, 14 Sep 2017 09:42:17 +0000 (12:42 +0300)
committerDongkyun Son <dongkyun.s@samsung.com>
Thu, 19 Oct 2017 23:49:38 +0000 (08:49 +0900)
Don't overwrite exit code in LSan when running on top of ASan in recovery mode
to avoid breakage of users code due to found leaks.

Change-Id: I172f59734837d3df350c9e586ace2547ae9f3f23
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
ChangeLog.Tizen
gcc/testsuite/gcc.dg/asan/leak_recover-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/asan/leak_recover-2.c [new file with mode: 0644]
libsanitizer/asan/asan_rtl.cc
libsanitizer/lsan/lsan_common.cc
libsanitizer/lsan/lsan_common.h

index f1ebf58..df9eeca 100644 (file)
 #     log at the same time (actually you can't).  However, if you update this
 #     file after the commit hash is fixed, you are free to add the commit hash.
 ################################################################################
+2017-10-20  Slava Barinov <v.barinov@samsung.com>
+
+       [TTC-9] Enable recovery mode for ASan with leak detector
+
+2017-10-17  Mikhail Kashkarov <m.kashkarov@partner.samsung.com>
+
+       Add armv7hl support.
 
 2017-09-26  Dongkyun Son <dongkyun.s@samsung.com>
 
diff --git a/gcc/testsuite/gcc.dg/asan/leak_recover-1.c b/gcc/testsuite/gcc.dg/asan/leak_recover-1.c
new file mode 100644 (file)
index 0000000..a17a72b
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+/* { dg-set-target-env-var ASAN_OPTIONS "halt_on_error=0" } */
+
+#include <stdlib.h>
+
+int f () {
+  volatile int* a = malloc(20);
+  a[0] = 1;
+  return a[0];
+}
+
+int main() {
+  f();
+}
+
+/* { dg-output {Direct leak of 20 byte} }  */
diff --git a/gcc/testsuite/gcc.dg/asan/leak_recover-2.c b/gcc/testsuite/gcc.dg/asan/leak_recover-2.c
new file mode 100644 (file)
index 0000000..1f57fb4
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do run } */
+/* { dg-set-target-env-var ASAN_OPTIONS "halt_on_error=1" } */
+/* { dg-shouldfail "asan" } */
+
+#include <stdlib.h>
+
+int f () {
+  volatile int* a = malloc(20);
+  a[0] = 1;
+  return a[0];
+}
+
+int main() {
+  f();
+}
+
+/* { dg-output {Direct leak of 20 byte} }  */
index ba8cbb3..8b28e6a 100644 (file)
@@ -595,7 +595,10 @@ static void AsanInitInternal() {
   if (CAN_SANITIZE_LEAKS) {
     __lsan::InitCommonLsan();
     if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit) {
-      Atexit(__lsan::DoLeakCheck);
+      if (flags()->halt_on_error)
+       Atexit(__lsan::DoLeakCheck);
+      else
+       Atexit(__lsan::DoRecoverableLeakCheckVoid);
     }
   }
 
index 670eb60..3808f2b 100644 (file)
@@ -509,6 +509,10 @@ static int DoRecoverableLeakCheck() {
   return have_leaks ? 1 : 0;
 }
 
+void DoRecoverableLeakCheckVoid() {
+  DoRecoverableLeakCheck();
+}
+
 static Suppression *GetSuppressionForAddr(uptr addr) {
   Suppression *s = nullptr;
 
@@ -671,6 +675,7 @@ uptr LeakReport::UnsuppressedLeakCount() {
 namespace __lsan {
 void InitCommonLsan() { }
 void DoLeakCheck() { }
+void DoRecoverableLeakCheckVoid() { }
 void DisableInThisThread() { }
 void EnableInThisThread() { }
 }
index 53cd1c6..85b76db 100644 (file)
@@ -117,6 +117,7 @@ enum IgnoreObjectResult {
 // Functions called from the parent tool.
 void InitCommonLsan();
 void DoLeakCheck();
+void DoRecoverableLeakCheckVoid();
 bool DisabledInThisThread();
 
 // Used to implement __lsan::ScopedDisabler.