gcc-6-branch test failures: g++ c-c++-common/asan/pr59063-2.c

Jason Vas Dias jason.vas.dias@gmail.com
Mon May 21 17:14:00 GMT 2018


To me it looks like the definition of 'real_sigaction'
in 'asan_interceptors.cc' is actually going to
recursively call itself - so I tried patching
libsanitizer:

{BEGIN PATCH:
Index: asan/asan_interceptors.cc
===================================================================
--- asan/asan_interceptors.cc	(revision 260441)
+++ asan/asan_interceptors.cc	(working copy)
@@ -293,8 +293,8 @@
 
 namespace __sanitizer {
 int real_sigaction(int signum, const void *act, void *oldact) {
-  return REAL(sigaction)(signum, (const struct sigaction *)act,
-                         (struct sigaction *)oldact);
+  return ::sigaction(signum, (const struct sigaction *)act,
+ 		              (struct sigaction *)oldact);
 }
 } // namespace __sanitizer
 
Index: sanitizer_common/sanitizer_common_interceptors.inc
===================================================================
--- sanitizer_common/sanitizer_common_interceptors.inc	(revision 260441)
+++ sanitizer_common/sanitizer_common_interceptors.inc	(working copy)
@@ -2446,7 +2446,7 @@
 INTERCEPTOR(uptr, ptrace, int request, int pid, void *addr, void *data) {
   void *ctx;
   COMMON_INTERCEPTOR_ENTER(ctx, ptrace, request, pid, addr, data);
-  __sanitizer_iovec local_iovec;
+  __sanitizer_iovec local_iovec {};
 
   if (data) {
     if (request == ptrace_setregs)

END PATCH}

The second patch line removes a warning about local_iovec being
used uninitialized.

With the patch applied, the program does not coredump
and shows more what is going on:

$ ./pr59063-2.exe
==5898==Shadow memory range interleaves with an existing memory mapping. ASan cannot proceed correctly. ABORTING.
==5898==ASan shadow was supposed to be located in the [0x00007fff7000-0x10007fff7fff] range.
==5898==Process memory map follows:
	0x000000400000-0x000000522000	/tmp/pr59063-2.exe
	0x000000721000-0x000000723000	/tmp/pr59063-2.exe
	0x000000723000-0x000000726000	/tmp/pr59063-2.exe
	0x000000726000-0x000001398000	
	0x00007fff7000-0x00008fff7000	
	0x00008fff7000-0x02008fff7000	
	0x02008fff7000-0x10007fff8000	
	0x600000000000-0x640000000000	
	0x640000000000-0x640000003000	
	0x7f05baec2000-0x7f05bb566000	
	0x7f05bb566000-0x7f05bb72f000	/usr/lib64/libc-2.17.so
	0x7f05bb72f000-0x7f05bb92f000	/usr/lib64/libc-2.17.so
	0x7f05bb92f000-0x7f05bb933000	/usr/lib64/libc-2.17.so
	0x7f05bb933000-0x7f05bb935000	/usr/lib64/libc-2.17.so
	0x7f05bb935000-0x7f05bb93a000	
	0x7f05bb93a000-0x7f05bb950000	/home/devel/OS/gcc-6-branch/host-x86_64-linux-gnu/gcc/libgcc_s.so.1
	0x7f05bb950000-0x7f05bbb4f000	/home/devel/OS/gcc-6-branch/host-x86_64-linux-gnu/gcc/libgcc_s.so.1
	0x7f05bbb4f000-0x7f05bbb50000	/home/devel/OS/gcc-6-branch/host-x86_64-linux-gnu/gcc/libgcc_s.so.1
	0x7f05bbb50000-0x7f05bbb51000	/home/devel/OS/gcc-6-branch/host-x86_64-linux-gnu/gcc/libgcc_s.so.1
	0x7f05bbb51000-0x7f05bbb69000	/usr/lib64/libpthread-2.17.so
	0x7f05bbb69000-0x7f05bbd68000	/usr/lib64/libpthread-2.17.so
	0x7f05bbd68000-0x7f05bbd69000	/usr/lib64/libpthread-2.17.so
	0x7f05bbd69000-0x7f05bbd6a000	/usr/lib64/libpthread-2.17.so
	0x7f05bbd6a000-0x7f05bbd6e000	
	0x7f05bbd6e000-0x7f05bbd70000	/usr/lib64/libdl-2.17.so
	0x7f05bbd70000-0x7f05bbf70000	/usr/lib64/libdl-2.17.so
	0x7f05bbf70000-0x7f05bbf71000	/usr/lib64/libdl-2.17.so
	0x7f05bbf71000-0x7f05bbf72000	/usr/lib64/libdl-2.17.so
	0x7f05bbf72000-0x7f05bbf79000	/usr/lib64/librt-2.17.so
	0x7f05bbf79000-0x7f05bc178000	/usr/lib64/librt-2.17.so
	0x7f05bc178000-0x7f05bc179000	/usr/lib64/librt-2.17.so
	0x7f05bc179000-0x7f05bc17a000	/usr/lib64/librt-2.17.so
	0x7f05bc17a000-0x7f05bc27b000	/usr/lib64/libm-2.17.so
	0x7f05bc27b000-0x7f05bc47a000	/usr/lib64/libm-2.17.so
	0x7f05bc47a000-0x7f05bc47b000	/usr/lib64/libm-2.17.so
	0x7f05bc47b000-0x7f05bc47c000	/usr/lib64/libm-2.17.so
	0x7f05bc47c000-0x7f05bc5f6000	/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
	0x7f05bc5f6000-0x7f05bc7f6000	/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
	0x7f05bc7f6000-0x7f05bc800000	/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
	0x7f05bc800000-0x7f05bc802000	/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
	0x7f05bc802000-0x7f05bc806000	
	0x7f05bc806000-0x7f05bc92f000	/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libsanitizer/asan/.libs/libasan.so.3.0.0
	0x7f05bc92f000-0x7f05bcb2e000	/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libsanitizer/asan/.libs/libasan.so.3.0.0
	0x7f05bcb2e000-0x7f05bcb31000	/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libsanitizer/asan/.libs/libasan.so.3.0.0
	0x7f05bcb31000-0x7f05bcb34000	/home/devel/OS/gcc-6-branch/x86_64-linux-gnu/libsanitizer/asan/.libs/libasan.so.3.0.0
	0x7f05bcb34000-0x7f05bd7a6000	
	0x7f05bd7a6000-0x7f05bd7ca000	/usr/lib64/ld-2.17.so
	0x7f05bd998000-0x7f05bd99c000	
	0x7f05bd9a0000-0x7f05bd9c9000	
	0x7f05bd9c9000-0x7f05bd9ca000	/usr/lib64/ld-2.17.so
	0x7f05bd9ca000-0x7f05bd9cb000	/usr/lib64/ld-2.17.so
	0x7f05bd9cb000-0x7f05bd9cc000	
	0x7ffc828f0000-0x7ffc82911000	[stack]
	0x7ffc82984000-0x7ffc82986000	[vdso]
	0xffffffffff600000-0xffffffffff601000	[vsyscall]
==5898==End of process memory map.







So:

==5898==ASan shadow was supposed to be located in the
[0x00007fff7000-0x10007fff7fff] range.

And there are existing maps in that range :
	0x00007fff7000-0x00008fff7000	
	0x00008fff7000-0x02008fff7000	
	0x02008fff7000-0x10007fff8000


Could it be that somehow a link module init()
(__attribute__((constructor))) 'constructor' function in
the static libasan constructor has run. and set up the maps,
and then when dynamic libraries are loaded, the
constructor in the dynamic library tries
to construct the same maps ?

Really, I think perhaps the 'static-libasan'
option ought to be disabled until it is implemented
correctly , and/or the constructor should not be
insisting on a DT_NEEDED of libasan.so if -static-libasan
was supplied, and in any case it should be impossible to
call the constructor twice , even if the library
is loaded twice.

It looks like libasan still needs some major re-working
and I question why it is being included in the standard GCC
distribution & whether its test suite has ever passed.

Best Regards,
Jason






More information about the Gcc mailing list