Thread overview
get memcpy EXC_BAD_ACCESS only with LTO on multi platform!
Jul 17, 2020
Innot Sagg
Jul 18, 2020
Kagamin
Jul 18, 2020
Innot Sagg
Jul 18, 2020
Kagamin
Jul 18, 2020
Innot Sagg
Jul 18, 2020
Kagamin
Jul 18, 2020
Innot Sagg
Jul 18, 2020
Innot Sagg
July 17, 2020
I am not sure is this a ldc2 bug or my code bug.  I don't get it without LTO. with LTO I get this error on macOS, linux, Android(cross build and termux).


the code around this error:

new_ptr = my_zalloc(new_size);
if (! new_ptr ) {
	errno = -2;
	return errno;
}
new_ptr = 1 ;
if ( m_location ) {
	assert(old_ptr);
        // printf("m_location=%p\n", m_location); // add this line will not get error;
        // printf("old_ptr=%p\n", old_ptr); // add this line will not get error;
	llvm_memcpy(new_ptr, old_ptr, m_location);
}


I am not able to reduce it since I change any things the error will gone. for example if I add any one of the printf there will no error.

The linux error:
Program received signal SIGSEGV, Segmentation fault.
__memmove_sse2_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:384
384	../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S: No such file or directory.
#0  __memmove_sse2_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:384
#1  0x0000000000260f9b in expand (bu=0x7fffffffdc78, size=<optimized out>, zero=<optimized out>) at /d/buffer.d:919


the android error:
Program received signal SIGSEGV, Segmentation fault.
0x0000007fbf2bf10c in memcpy () from /system/lib64/libc.so
#0  0x0000007fbf2bf10c in memcpy () from /system/lib64/libc.so
#1  0x00000055555b8ad4 in expand (bu=0x7fffffe208, size=<optimized out>, zero=<optimized out>) at /data/data/com.termux/files/home/d/buffer.d:919

the maxOS error:
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x7ffeefc00000)
  * frame #0: 0x00007fff67c5c929 libsystem_platform.dylib`_platform_memmove$VARIANT$Haswell + 41
    frame #1: 0x0000000100001e2d tests.exe`expand + 269



the old_ptr is a 512 byte memory block,  m_location = 512.

LTO with -O0, -O1 -O2, -O3 trigger this error. (-O1 on linux no error, some of my debug code only work with -O0)

Add printf before the memcpy, or remove LTO will made the error go away.

test with ldc2-1.23.0-beta1 and ldc2-1.22.0, same results.

any suggestion how to deal with this case ?






July 18, 2020
Maybe the compiler can understand that new_ptr=1 and remove the copy.
July 18, 2020
On Saturday, 18 July 2020 at 03:33:30 UTC, Kagamin wrote:
> Maybe the compiler can understand that new_ptr=1 and remove the copy.

Thanks for replay. "new_ptr=1" is typo, the code already remove that line.


If i remove bitfields from Buffer struct, the error will gone.

This code will trigger LTO error:

struct Buffer {
   ubyte*	m_data;
   union {
	   ulong   m_placeholder;
	   uint	m_location;
	   mixin(bitfields!(
	             uint,    "",	32 ,
	             uint,    "m_size",	31 ,
	             bool,    "is_new",	1 ,
	   )) ;
	}
}

replace it to this will be no error:


struct Buffer {
   ubyte*	m_data;
   uint		m_location;
   uint         m_size;
   bool         is_new;
}


I am still not able to reduce it into minimal test case, because any small change in the code will made the errno disappear.




July 18, 2020
AFAIK, ldc supports memory sanitizers, try to use them.
July 18, 2020
On Saturday, 18 July 2020 at 03:58:22 UTC, Kagamin wrote:
> AFAIK, ldc supports memory sanitizers, try to use them.

Add "-fsanitize=address" made the errno disappear.
July 18, 2020
Try -fsanitize=undefined
July 18, 2020
On Saturday, 18 July 2020 at 04:55:44 UTC, Kagamin wrote:
> Try -fsanitize=undefined

Error: Unrecognized -fsanitize value 'undefined'.
July 18, 2020
On Saturday, 18 July 2020 at 04:55:44 UTC, Kagamin wrote:
> Try -fsanitize=undefined

After add -fsanitize=address, lto build no problem.

Build without lto raise problem macOS:

Undefined symbols for architecture x86_64:
  "___asan_version_mismatch_check_apple_clang_1103", referenced from:
      _asan.module_ctor in libmyhelp.a(mycode.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

libmyhelp.a is the c static build with clang -fsanitize=address.

If also pass -fsanitize=address to the clang when it called by ldc doing the link work. (ldc2 lto or non-lto same error)  I get this runtime error:


=================================================================
==52571==ERROR: AddressSanitizer: unknown-crash on address 0x1c8000000000 at pc 0x000100129ff8 bp 0x7ffeefbfdda0 sp 0x7ffeefbfd560
WRITE of size 1536 at 0x1c8000000000 thread T0
AddressSanitizer:DEADLYSIGNAL
=================================================================
==52571==ERROR: AddressSanitizer: BUS on unknown address 0x624000000010 (pc 0x000100117c21 bp 0x7ffeefbfb320 sp 0x7ffeefbfb300 T16777215)
    <empty stack>

==52571==Register values:
rax = 0x0000624000000000  rbx = 0x000000010271f060  rcx = 0x000061d000000070  rdx = 0x00007ffeefbfb3f8
rdi = 0x000000010271f060  rsi = 0x000000010271f0e0  rbp = 0x00007ffeefbfb320  rsp = 0x00007ffeefbfb300
 r8 = 0x0000000000000828   r9 = 0x00000fffffffffff  r10 = 0x0000000000000000  r11 = 0xffffffffffffffff
r12 = 0x00007ffeefbfb3f8  r13 = 0x00007ffeefbfb3f8  r14 = 0x0000000000000828  r15 = 0x000061d000000070
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: BUS
AddressSanitizer:DEADLYSIGNAL
AddressSanitizer: nested bug in the same thread, aborting.