• Austin Clements's avatar
    runtime: align allocations harder in GODEBUG=sbrk=1 mode · 5b15510d
    Austin Clements authored
    Currently, GODEBUG=sbrk=1 mode aligns allocations by their type's
    alignment. You would think this would be the right thing to do, but
    because 64-bit fields are only 4-byte aligned right now (see #599),
    this can cause a 64-bit field of an allocated object to be 4-byte
    aligned, but not 8-byte aligned. If there is an atomic access to that
    unaligned 64-bit field, it will crash.
    
    This doesn't happen in normal allocation mode because the
    size-segregated allocation and the current size classes will cause any
    types larger than 8 bytes to be 8 byte aligned.
    
    We fix this by making sbrk=1 mode use alignment based on the type's
    size rather than its declared alignment. This matches how the tiny
    allocator aligns allocations.
    
    This was tested with
    
      GOARCH=386 GODEBUG=sbrk=1 go test sync/atomic
    
    This crashes with an unaligned access before this change, and passes
    with this change.
    
    This should be reverted when/if we fix #599.
    
    Fixes #33159.
    
    Change-Id: Ifc52c72c6b99c5d370476685271baa43ad907565
    Reviewed-on: https://go-review.googlesource.com/c/go/+/186919
    Run-TryBot: Austin Clements <austin@google.com>
    Reviewed-by: default avatarKeith Randall <khr@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    5b15510d
malloc.go 46.8 KB