Skip to content
Snippets Groups Projects
  • Keith Randall's avatar
    8477562c
    cmd/compile: be more careful about pointer incrementing in range loops · 8477562c
    Keith Randall authored
    For range loops, we use a pointer to the backing store that gets
    incremented on each iteration of the loop.
    
    The problem with this scheme is that at the end of the last iteration,
    we may briefly have a pointer that points past the end of the backing store
    of the slice that is being iterated over. We cannot let the garbage collector
    see that pointer.
    
    To fix this problem, have the incremented pointer live briefly as
    a uintptr instead of a normal pointer, so it doesn't keep anything
    alive. Convert back to a normal pointer just after the loop condition
    is checked, but before anything that requires a real pointer representation
    (in practice, any call, which is what could cause a GC scan or stack copy).
    
    Fixes #56699
    
    Change-Id: Ia928d23f85a211565357603668bea4e5c534f989
    Reviewed-on: https://go-review.googlesource.com/c/go/+/449995
    
    
    Reviewed-by: default avatarDavid Chase <drchase@google.com>
    TryBot-Result: Gopher Robot <gobot@golang.org>
    Reviewed-by: default avatarKeith Randall <khr@google.com>
    Run-TryBot: Keith Randall <khr@golang.org>
    Reviewed-by: default avatarCuong Manh Le <cuong.manhle.vn@gmail.com>
    8477562c
    History
    cmd/compile: be more careful about pointer incrementing in range loops
    Keith Randall authored
    For range loops, we use a pointer to the backing store that gets
    incremented on each iteration of the loop.
    
    The problem with this scheme is that at the end of the last iteration,
    we may briefly have a pointer that points past the end of the backing store
    of the slice that is being iterated over. We cannot let the garbage collector
    see that pointer.
    
    To fix this problem, have the incremented pointer live briefly as
    a uintptr instead of a normal pointer, so it doesn't keep anything
    alive. Convert back to a normal pointer just after the loop condition
    is checked, but before anything that requires a real pointer representation
    (in practice, any call, which is what could cause a GC scan or stack copy).
    
    Fixes #56699
    
    Change-Id: Ia928d23f85a211565357603668bea4e5c534f989
    Reviewed-on: https://go-review.googlesource.com/c/go/+/449995
    
    
    Reviewed-by: default avatarDavid Chase <drchase@google.com>
    TryBot-Result: Gopher Robot <gobot@golang.org>
    Reviewed-by: default avatarKeith Randall <khr@google.com>
    Run-TryBot: Keith Randall <khr@golang.org>
    Reviewed-by: default avatarCuong Manh Le <cuong.manhle.vn@gmail.com>
Code owners
Assign users and groups as approvers for specific file changes. Learn more.