Skip to content

Commit 97992dd

Browse files
nicolasgarzagvisor-bot
authored andcommitted
Remove SliceHeader and replace.
Removes most uses of SliceHeader as referenced by #8422 SliceHeader is deprecated - so we prefer to use unsafe.Slice() and unsafe.Pointer(). FUTURE_COPYBARA_INTEGRATE_REVIEW=#12368 from nicolasgarza:remove-slice-header 52fddb7 PiperOrigin-RevId: 843970549
1 parent 7d4e598 commit 97992dd

File tree

11 files changed

+30
-85
lines changed

11 files changed

+30
-85
lines changed

nogo.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ analyzers:
190190
- pkg/aio/aio_linux_unsafe.go # Special case.
191191
- pkg/eventfd/eventfd_unsafe.go # Special case.
192192
- "pkg/flipcall/.*_unsafe.go" # Special case.
193+
- pkg/memutil/memutil_unsafe.go # Special case.
194+
- pkg/tcpip/link/sharedmem/sharedmem_unsafe.go # Special case.
193195
- pkg/gohacks/noescape_unsafe.go # Special case.
194196
- pkg/ring0/pagetables/allocator_unsafe.go # Special case.
195197
- pkg/sentry/devices/nvproxy/frontend_mmap_unsafe.go # Special case.

pkg/buffer/view_unsafe.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@
1515
package buffer
1616

1717
import (
18-
"reflect"
1918
"unsafe"
2019
)
2120

2221
// BasePtr returns a pointer to the view's chunk.
2322
func (v *View) BasePtr() *byte {
24-
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&v.chunk.data))
25-
return (*byte)(unsafe.Pointer(hdr.Data))
23+
return unsafe.SliceData(v.chunk.data)
2624
}

pkg/flipcall/flipcall_unsafe.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package flipcall
1616

1717
import (
18-
"reflect"
1918
"unsafe"
2019

2120
"gvisor.dev/gvisor/pkg/atomicbitops"
@@ -62,12 +61,9 @@ func (ep *Endpoint) dataLen() *atomicbitops.Uint32 {
6261
// - Writers must not assume that they will read back the same data that they
6362
// have written. In other words, writers should avoid reading from Data() at
6463
// all.
65-
func (ep *Endpoint) Data() (bs []byte) {
66-
bshdr := (*reflect.SliceHeader)(unsafe.Pointer(&bs))
67-
bshdr.Data = ep.packet + PacketHeaderBytes
68-
bshdr.Len = int(ep.dataCap)
69-
bshdr.Cap = int(ep.dataCap)
70-
return
64+
func (ep *Endpoint) Data() []byte {
65+
ptr := unsafe.Pointer(ep.packet + PacketHeaderBytes)
66+
return unsafe.Slice((*byte)(ptr), int(ep.dataCap))
7167
}
7268

7369
// ioSync is a dummy variable used to indicate synchronization to the Go race

pkg/memutil/memutil_unsafe.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package memutil
1717

1818
import (
19-
"reflect"
2019
"unsafe"
2120

2221
"golang.org/x/sys/unix"
@@ -28,17 +27,13 @@ func MapSlice(addr, size, prot, flags, fd, offset uintptr) ([]byte, error) {
2827
if err != nil {
2928
return nil, err
3029
}
31-
var slice []byte
32-
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&slice))
33-
hdr.Data = addr
34-
hdr.Len = int(size)
35-
hdr.Cap = int(size)
36-
return slice, nil
30+
31+
return unsafe.Slice((*byte)(unsafe.Pointer(addr)), int(size)), nil
3732
}
3833

3934
// UnmapSlice unmaps a mapping returned by MapSlice.
4035
func UnmapSlice(slice []byte) error {
41-
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&slice))
42-
_, _, err := unix.RawSyscall6(unix.SYS_MUNMAP, uintptr(unsafe.Pointer(hdr.Data)), uintptr(hdr.Cap), 0, 0, 0, 0)
36+
ptr := unsafe.SliceData(slice)
37+
_, _, err := unix.RawSyscall6(unix.SYS_MUNMAP, uintptr(unsafe.Pointer(ptr)), uintptr(cap(slice)), 0, 0, 0, 0)
4338
return err
4439
}

pkg/rawfile/rawfile_unsafe.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
package rawfile
2020

2121
import (
22-
"reflect"
2322
"unsafe"
2423

2524
"golang.org/x/sys/unix"
@@ -43,12 +42,9 @@ func IovecFromBytes(bs []byte) unix.Iovec {
4342
return iov
4443
}
4544

46-
func bytesFromIovec(iov unix.Iovec) (bs []byte) {
47-
sh := (*reflect.SliceHeader)(unsafe.Pointer(&bs))
48-
sh.Data = uintptr(unsafe.Pointer(iov.Base))
49-
sh.Len = int(iov.Len)
50-
sh.Cap = int(iov.Len)
51-
return
45+
func bytesFromIovec(iov unix.Iovec) []byte {
46+
ptr := unsafe.Pointer(iov.Base)
47+
return unsafe.Slice((*byte)(ptr), int(iov.Len))
5248
}
5349

5450
// AppendIovecFromBytes returns append(iovs, IovecFromBytes(bs)). If len(bs) ==

pkg/sentry/platform/systrap/stub_unsafe.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"fmt"
1919
"io/ioutil"
2020
"math/rand"
21-
"reflect"
2221
"strconv"
2322
"strings"
2423
"unsafe"
@@ -69,11 +68,7 @@ func copySeccompRulesToStub(instrs []bpf.Instruction, stubAddr, size uintptr) {
6968
panic("not enough space for sysmsg seccomp rules")
7069
}
7170

72-
var targetSlice []bpf.Instruction
73-
sh := (*reflect.SliceHeader)(unsafe.Pointer(&targetSlice))
74-
sh.Data = progPtr
75-
sh.Cap = len(instrs)
76-
sh.Len = sh.Cap
71+
targetSlice := unsafe.Slice((*bpf.Instruction)(unsafe.Pointer(progPtr)), len(instrs))
7772

7873
copy(targetSlice, instrs)
7974

pkg/tcpip/link/sharedmem/sharedmem_unsafe.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package sharedmem
1616

1717
import (
1818
"fmt"
19-
"reflect"
2019
"unsafe"
2120

2221
"golang.org/x/sys/unix"
@@ -48,12 +47,7 @@ func getBuffer(fd int) ([]byte, error) {
4847
return nil, fmt.Errorf("failed to map memory for buffer fd: %d, error: %s", fd, err)
4948
}
5049

51-
// Use unsafe to convert addr into a []byte.
52-
var b []byte
53-
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&b))
54-
hdr.Data = addr
55-
hdr.Len = int(s.Size)
56-
hdr.Cap = int(s.Size)
50+
b := unsafe.Slice((*byte)(unsafe.Pointer(addr)), int(s.Size))
5751

5852
return b, nil
5953
}

pkg/tcpip/transport/tcp/connect_unsafe.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package tcp
1616

1717
import (
18-
"reflect"
1918
"unsafe"
2019
)
2120

@@ -26,5 +25,5 @@ import (
2625
func optionsToArray(options []byte) *[maxOptionSize]byte {
2726
// Reslice to full capacity.
2827
options = options[0:maxOptionSize]
29-
return (*[maxOptionSize]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&options)).Data))
28+
return (*[maxOptionSize]byte)(unsafe.Pointer(&options[0]))
3029
}

pkg/xdp/xdp_unsafe.go

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ package xdp
1616

1717
import (
1818
"fmt"
19-
"reflect"
2019
"unsafe"
2120

2221
"golang.org/x/sys/unix"
@@ -62,20 +61,16 @@ func sizeOfTXQueueDesc() uint64 {
6261
}
6362

6463
func (fq *FillQueue) init(off unix.XDPMmapOffsets, opts Opts) {
65-
fillQueueRingHdr := (*reflect.SliceHeader)(unsafe.Pointer(&fq.ring))
66-
fillQueueRingHdr.Data = uintptr(unsafe.Pointer(&fq.mem[off.Fr.Desc]))
67-
fillQueueRingHdr.Len = int(opts.NDescriptors)
68-
fillQueueRingHdr.Cap = fillQueueRingHdr.Len
64+
base := unsafe.Pointer(&fq.mem[off.Fr.Desc])
65+
fq.ring = unsafe.Slice((*uint64)(base), int(opts.NDescriptors))
6966
fq.producer = (*atomicbitops.Uint32)(unsafe.Pointer(&fq.mem[off.Fr.Producer]))
7067
fq.consumer = (*atomicbitops.Uint32)(unsafe.Pointer(&fq.mem[off.Fr.Consumer]))
7168
fq.flags = (*atomicbitops.Uint32)(unsafe.Pointer(&fq.mem[off.Fr.Flags]))
7269
}
7370

7471
func (rq *RXQueue) init(off unix.XDPMmapOffsets, opts Opts) {
75-
rxQueueRingHdr := (*reflect.SliceHeader)(unsafe.Pointer(&rq.ring))
76-
rxQueueRingHdr.Data = uintptr(unsafe.Pointer(&rq.mem[off.Rx.Desc]))
77-
rxQueueRingHdr.Len = int(opts.NDescriptors)
78-
rxQueueRingHdr.Cap = rxQueueRingHdr.Len
72+
base := unsafe.Pointer(&rq.mem[off.Rx.Desc])
73+
rq.ring = unsafe.Slice((*unix.XDPDesc)(base), int(opts.NDescriptors))
7974
rq.producer = (*atomicbitops.Uint32)(unsafe.Pointer(&rq.mem[off.Rx.Producer]))
8075
rq.consumer = (*atomicbitops.Uint32)(unsafe.Pointer(&rq.mem[off.Rx.Consumer]))
8176
rq.flags = (*atomicbitops.Uint32)(unsafe.Pointer(&rq.mem[off.Rx.Flags]))
@@ -86,10 +81,8 @@ func (rq *RXQueue) init(off unix.XDPMmapOffsets, opts Opts) {
8681
}
8782

8883
func (cq *CompletionQueue) init(off unix.XDPMmapOffsets, opts Opts) {
89-
completionQueueRingHdr := (*reflect.SliceHeader)(unsafe.Pointer(&cq.ring))
90-
completionQueueRingHdr.Data = uintptr(unsafe.Pointer(&cq.mem[off.Cr.Desc]))
91-
completionQueueRingHdr.Len = int(opts.NDescriptors)
92-
completionQueueRingHdr.Cap = completionQueueRingHdr.Len
84+
base := unsafe.Pointer(&cq.mem[off.Cr.Desc])
85+
cq.ring = unsafe.Slice((*uint64)(base), int(opts.NDescriptors))
9386
cq.producer = (*atomicbitops.Uint32)(unsafe.Pointer(&cq.mem[off.Cr.Producer]))
9487
cq.consumer = (*atomicbitops.Uint32)(unsafe.Pointer(&cq.mem[off.Cr.Consumer]))
9588
cq.flags = (*atomicbitops.Uint32)(unsafe.Pointer(&cq.mem[off.Cr.Flags]))
@@ -100,10 +93,8 @@ func (cq *CompletionQueue) init(off unix.XDPMmapOffsets, opts Opts) {
10093
}
10194

10295
func (tq *TXQueue) init(off unix.XDPMmapOffsets, opts Opts) {
103-
txQueueRingHdr := (*reflect.SliceHeader)(unsafe.Pointer(&tq.ring))
104-
txQueueRingHdr.Data = uintptr(unsafe.Pointer(&tq.mem[off.Tx.Desc]))
105-
txQueueRingHdr.Len = int(opts.NDescriptors)
106-
txQueueRingHdr.Cap = txQueueRingHdr.Len
96+
base := unsafe.Pointer(&tq.mem[off.Tx.Desc])
97+
tq.ring = unsafe.Slice((*unix.XDPDesc)(base), int(opts.NDescriptors))
10798
tq.producer = (*atomicbitops.Uint32)(unsafe.Pointer(&tq.mem[off.Tx.Producer]))
10899
tq.consumer = (*atomicbitops.Uint32)(unsafe.Pointer(&tq.mem[off.Tx.Consumer]))
109100
tq.flags = (*atomicbitops.Uint32)(unsafe.Pointer(&tq.mem[off.Tx.Flags]))

tools/go_marshal/analysis/analysis_unsafe.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,9 @@ func RandomizeValue(x any) {
5454
panic("RandomizeType() called with an unaddressable value. You probably need to pass a pointer to the argument")
5555
}
5656

57-
// Cast the underlying memory for the type into a byte slice.
58-
var b []byte
59-
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&b))
57+
size := int(v.Type().Size())
6058
// Note: v.UnsafeAddr panics if x is passed by value. x should be a pointer.
61-
hdr.Data = v.UnsafeAddr()
62-
hdr.Len = int(v.Type().Size())
63-
hdr.Cap = hdr.Len
59+
b := unsafe.Slice((*byte)(unsafe.Pointer(v.UnsafeAddr())), size)
6460

6561
// Fill the byte slice with random data, which in effect fills the type with
6662
// random values.

0 commit comments

Comments
 (0)