I am trying to understand and learn cgo, and as a part of that, I wrote a function that checks for filepermission using C.stat
.
我正在尝试理解和学习cgo,作为其中的一部分,我编写了一个使用C.stat检查filepermission的函数。
import (
"fmt"
"unsafe"
"os"
)
//#include <sys/stat.h>
//#include <stdlib.h>
import "C"
func CheckPerm(filename string) {
statt := C.stat //stat struct from C
path := C.CString(filename)
st := *(*C.struct_stat)(unsafe.Pointer(statt)) //Casting unsafe pointer to C.struct_stat
defer C.free(unsafe.Pointer(path)) //free
defer C.free(unsafe.Pointer(statt))
C.stat(path, &st)
if st.st_mode & C.S_IRGRP > 0 || st.st_mode & C.S_IWGRP > 0 || st.st_mode & C.S_IXGRP > 0 || st.st_mode & C.S_IROTH > 0 || st.st_mode & C.S_IWOTH > 0 || st.st_mode & C.S_IXOTH > 0 {
fmt.Println("file permission too broad, make it non-readable to groups and others.")
os.Exit(1)
}
fmt.Println("File permission looks fine")
}
}
Upon passing a filepath to the function, it errors out saying
在将文件路径传递给函数时,它出错了
*** Error in `/tmp/Build go-sync.go and run77go': double free or corruption (out): 0x0000000000609480 ***
SIGABRT: abort
PC=0x7fe4302f3267 m=0
signal arrived during cgo execution
goroutine 1 [syscall, locked to thread]:
runtime.cgocall(0x401930, 0xc820097808, 0xc800000000)
/usr/lib/go/src/runtime/cgocall.go:120 +0x11b fp=0xc8200977d8 sp=0xc8200977a8
gosyncmodules._Cfunc_free(0x609480)
==========snip============
Because of the last line pasted here gosyncmodules._Cfunc_free(0x609480)
, I removed the defer C.free(unsafe.Pointer(statt))
and it works fine now.
由于最后一行粘贴在这里gosyncmodules._Cfunc_free(0x609480),我删除了延迟C.free(unsafe.Pointer(statt)),它现在工作正常。
- Why is it throwing error when I am trying to free the struct that was created, whereas it can be used to free the path variable?
- 当我试图释放创建的结构时,为什么它会抛出错误,而它可以用来释放路径变量?
- Will a similar scenario cause a memory leak, if not in this case?
- 类似的情况是否会导致内存泄漏,如果不是这种情况?
1 个解决方案
#1
2
From https://golang.org/cmd/cgo/#hdr-Go_references_to_C :
来自https://golang.org/cmd/cgo/#hdr-Go_references_to_C:
// Go string to C string
// The C string is allocated in the C heap using malloc.
// It is the caller's responsibility to arrange for it to be
// freed, such as by calling C.free (be sure to include stdlib.h
// if C.free is needed).
func C.CString(string) *C.char
Your
你的
path := C.CString(filename)
makes a copy and you have to free it while statt
is a normal Go-memory-managed variable.
制作副本,你必须释放它,而statt是一个普通的Go-memory管理变量。
#1
2
From https://golang.org/cmd/cgo/#hdr-Go_references_to_C :
来自https://golang.org/cmd/cgo/#hdr-Go_references_to_C:
// Go string to C string
// The C string is allocated in the C heap using malloc.
// It is the caller's responsibility to arrange for it to be
// freed, such as by calling C.free (be sure to include stdlib.h
// if C.free is needed).
func C.CString(string) *C.char
Your
你的
path := C.CString(filename)
makes a copy and you have to free it while statt
is a normal Go-memory-managed variable.
制作副本,你必须释放它,而statt是一个普通的Go-memory管理变量。