I understand that, by the case 6 in the unsafe package docs,
the second program should be safe with or without the runtime.KeepAlive 
call.
I just wonder how Go runtime achieves this goal.
I have an impression that pointer assignments in Go by gc is atomically,
but is this also true for uintptr value assignments?


On Wednesday, April 22, 2020 at 7:33:22 AM UTC-4, T L wrote:
>
>
>
> On Tuesday, April 21, 2020 at 8:13:17 PM UTC-4, Ian Lance Taylor wrote:
>>
>> On Tue, Apr 21, 2020 at 8:17 AM T L <tapi...@gmail.com> wrote: 
>> > 
>> > And is the runtime.KeepAlive call in the following program essential to 
>> keep the correctness? 
>> > 
>> > package main 
>> > 
>> > import ( 
>> >     "fmt" 
>> >     "unsafe" 
>> >     "reflect" 
>> >     "runtime" 
>> > ) 
>> > 
>> > func main() { 
>> >     a := [6]byte{'G', 'o', 'o', 'g', 'l', 'e'} 
>> >     bs := []byte("Golang") 
>> >     hdr := (*reflect.SliceHeader)(unsafe.Pointer(&bs)) 
>> >     hdr.Data = uintptr(unsafe.Pointer(&a)) 
>> > 
>> >     runtime.KeepAlive(&a) // Is this line essential here? 
>> > 
>> >     hdr.Len = 2 
>> >     hdr.Cap = len(a) 
>> >     fmt.Printf("%s\n", bs) // Go 
>> >     bs = bs[:cap(bs)] 
>> >     fmt.Printf("%s\n", bs) // Google 
>> > } 
>>
>> I do not think the runtime.KeepAlive is required.  Setting the Data 
>> field using a *SliceHeader should keep the value alive. 
>>
>> Ian 
>>
>
>
> Many thanks for the answers.
>
> I have another question, which doesn't matter with or without the 
> runtime.KeepAlive call.
> We know that assignment in Go is not atomic.
> Is it possible that when the assignment "hdr.Data = 
> uintptr(unsafe.Pointer(&a))" is half done,
> the stack is resized, so the address of a might be changed (assume a is 
> allocated on stack),
> the hdr.Data will be assigned the old invalid value?
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/2b9b1bec-4176-421f-8820-a6ff2bf2ead2%40googlegroups.com.

Reply via email to