apache / apache/arrow-go

[Go] array.String.Value is unsafe

Open
#68 1 comment 0 reactions 1 assignee Claimed by @rtadepalli View on GitHub
Type: bug
Dominant language
Assembly
Stars
404
Forks
145
Avg merge
2d 4h
Merged PRs (30d)
87

Description

### Describe the bug, including details regarding any error messages, version, and platform.

String.Value slices a backing string:

```go
func (a *String) Value(i int) string {
i = i + a.array.data.offset
return a.values[a.offsets[i]:a.offsets[i+1]]
}
```

Which points directly into the buffer data:

```go
if vdata := data.buffers[2]; vdata != nil {
b := vdata.Bytes()
a.values = *(*string)(unsafe.Pointer(&b))
}
```

This seems OK when the buffer is Go-allocated since the GC will take care of it (regardless of Release/Retain). But when the buffer is C-allocated (e.g. C Data Interface, mallocator), if the string outlives the array, we have a dangling pointer!

I believe we should copy the string (and frankly, get rid of the unsafe here) to be safe (which also has the side effect that getting a single value out of an array will no longer keep the entire backing array alive). If the extra garbage is an issue, we should consider some sort of string view type.

### Component(s)

Go

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.