On Wed, Jun 12, 2019 at 12:14 PM Neil Schellenberger
<[email protected]> wrote:
>
> Sorry for the delay in responding.  Filed as 
> https://github.com/golang/go/issues/32579.

Thanks.

Ian

> On Tue, Jun 11, 2019 at 1:21 AM Ian Lance Taylor <[email protected]> wrote:
>>
>> On Mon, Jun 10, 2019 at 9:14 PM Neil Schellenberger
>> <[email protected]> wrote:
>> >
>> > When upgrading our build container from 1.11.10 to 1.12.5, some of our 
>> > tests failed in a surprising way.  I've boiled down the issue to this 
>> > short example code fragment.
>> >
>> > package main
>> >
>> > // #include <string.h>
>> > // struct S { unsigned char data[18]; };
>> > import "C"
>> > import "unsafe"
>> >
>> > func main() {
>> > var array [5]C.struct_S
>> > for i := range array {
>> > C.memset(unsafe.Pointer(&array[i].data[0]), 0xff, C.sizeof_struct_S)
>> > }
>> > for i := range array {
>> > for j := range array[i].data {
>> > if array[i].data[j] != C.uchar(0xff) {
>> > panic("oops")
>> > }
>> > }
>> > }
>> > }
>> >
>> > Under 1.11 this runs to completion; under 1.12 it panics.
>> >
>> > Debugging and instrumenting shows that the problem is the first argument 
>> > to memset is not what one would expect when run under 1.12.  (The address 
>> > of a heap temporary copy rather than the original perhaps?)
>> >
>> > Strangely, either parenthesising the argument expression to the address 
>> > operand ("&(array[i].data[0])") or removing the final index expression 
>> > ("&array[i].data") "fixes" the problem.
>> >
>> > I've spelunked through the AST (identical under both); the liveness and 
>> > escape analysis (different); the parse tree (different); and the go asm 
>> > (different).  Frankly, my gc-fu is very weak and I don't really know what 
>> > I'm looking for.
>> >
>> > I assume that the root cause is that we were violating some sort of 
>> > liveness or escape policy, but I can't figure out what it would be (or why 
>> > minor syntactic changes "fix" things).  I'd be quite curious to know.
>> >
>> > The workaround in the real code is simple, so this isn't a huge issue, 
>> > just a a bit of a mystery.
>>
>> It's a bug.  Would you mind opening an issue with this test case at
>> https://golang.org/issue?  Thanks.
>>
>> Ian

-- 
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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcWCKn3rOJKUQ%2B9U6km_ZEsT4BzhqwORNtDqBdDY7PQj-g%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to