Skip to content

[Go] array.String.Value is unsafe #68

Open
@lidavidm

Description

@lidavidm

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

String.Value slices a backing string:

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:

	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

Metadata

Metadata

Assignees

Labels

Type: bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions