{src: "asan_unsafe_fail1.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail1.go:25"},
{src: "asan_unsafe_fail2.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail2.go:25"},
{src: "asan_unsafe_fail3.go", memoryAccessError: "use-after-poison", errorLocation: "asan_unsafe_fail3.go:18"},
+ {src: "asan_global1_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global1_fail.go:12"},
+ {src: "asan_global2_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global2_fail.go:19"},
+ {src: "asan_global3_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global3_fail.go:13"},
+ {src: "asan_global4_fail.go", memoryAccessError: "global-buffer-overflow", errorLocation: "asan_global4_fail.go:21"},
+ {src: "asan_global5.go"},
}
for _, tc := range cases {
tc := tc
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+int test(int *a) {
+ a[2] = 300; // BOOM
+ return a[2];
+}
+*/
+import "C"
+
+import "fmt"
+
+var cIntArray [2]C.int
+
+func main() {
+ r := C.test(&cIntArray[0])
+ fmt.Println("r value = ", r)
+}
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+struct ss {
+ int *p;
+ int len;
+ int cap;
+};
+
+int test(struct ss *a) {
+ struct ss *t = a + 1;
+ t->len = 100; // BOOM
+ return t->len;
+}
+*/
+import "C"
+import "fmt"
+
+var tt C.struct_ss
+
+func main() {
+ r := C.test(&tt)
+ fmt.Println("r value = ", r)
+}
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+/*
+#include <stdlib.h>
+#include <stdio.h>
+
+int test(int *a) {
+ int* p = a+1;
+ *p = 10; // BOOM
+ return *p;
+}
+*/
+import "C"
+import (
+ "fmt"
+ "unsafe"
+)
+
+var cIntV C.int
+
+func main() {
+ r := C.test((*C.int)(unsafe.Pointer(&cIntV)))
+ fmt.Printf("r value is %d", r)
+}
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "fmt"
+ "unsafe"
+)
+
+var intGlo int
+
+func main() {
+ r := bar(&intGlo)
+ fmt.Printf("r value is %d", r)
+}
+
+func bar(a *int) int {
+ p := (*int)(unsafe.Add(unsafe.Pointer(a), 1*unsafe.Sizeof(int(1))))
+ if *p == 10 { // BOOM
+ fmt.Println("its value is 10")
+ }
+ return *p
+}
--- /dev/null
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ "fmt"
+)
+
+type Any struct {
+ s string
+ b int64
+}
+
+var Sg = []interface{}{
+ Any{"a", 10},
+}
+
+func main() {
+ fmt.Println(Sg[0])
+}