Skip to content

ASan breaks __seg_gs #124238

Open
Open
@glandium

Description

@glandium

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions