lidavidm opened a new issue, #33999:
URL: https://github.com/apache/arrow/issues/33999

   ### 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


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to