Open
Description
Take this source:
#include <cstdint>
void test(uintptr_t addr) {
__builtin_memcpy((void __seg_gs*)addr, "x", 1);
}
It compiles to
test(unsigned long):
push rbp
mov rbp, rsp
mov qword ptr [rbp - 8], rdi
mov rax, qword ptr [rbp - 8]
mov byte ptr gs:[rax], 120
pop rbp
ret
Or even
test(unsigned long):
mov byte ptr gs:[rdi], 120
ret
Without ASan, but with ASan:
test(unsigned long):
push rbp
mov rbp, rsp
sub rsp, 16
mov qword ptr [rbp - 8], rdi
mov rdi, qword ptr [rbp - 8]
lea rsi, [rip + .str]
mov edx, 1
call __asan_memcpy@PLT
add rsp, 16
pop rbp
ret
The gs:
addressing is gone.
Funnily enough, with -O
+ ASan, it compiles to the same thing as without ASan.
Obligatory godbolt link: https://godbolt.org/z/8hWGxdc3P