On Sunday, February 25, 2018 at 10:01:44 AM UTC-5, Jan Mercl wrote:
>
>
> On Sun, Feb 25, 2018 at 3:20 PM <[email protected] <javascript:>> wrote:
>
> > I think the unsafe rules allow this.
>
> Yes, but using unsafe provides no guarantees about writable memory.
>
> > I never expect it will crash, for I can't get any information about the
> write protection mechanism.
>
> That's not part of the memory model and most probably never will. Layout
> and/or protection of the sections is the design choice of the compiler
> writer. But text constants are put in a R/O segment by many, if not most
> AOT compilers.
>
>
I think I get it.
Because the above program tries to modify the constant (or program) zone,
which is not allowed.
The following program works:
package main
import "fmt"
import "unsafe"
import "reflect"
func main() {
s := string([]byte{'k', 'e', 'e', 'p'})
hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))
byteSequence := (*byte)(unsafe.Pointer(hdr.Data))
fmt.Println(string(*byteSequence)) // k
*byteSequence = 'j' // crash here
fmt.Println(s) // expect: jeep
}
>
> --
>
> -j
>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.