CGo Segfault при возврате C.CString - PullRequest
       28

CGo Segfault при возврате C.CString

3 голосов
/ 01 октября 2019

Я пытаюсь вызвать функцию Go из кода C, но я столкнулся с проблемой, которую не могу объяснить:

C:

char * ret; 
CheckDpkgInfo(&ret);
printf("%s", ret);

Go:

func CheckDpkgInfo(dpkg_c **C.char) { 
*dpkg_c = C.CString("whatever")
}

Это работает, но не тогда, когда я просто возвращаю строку переменного тока из Go (segfault):

C:

char * ret = CheckDpkgInfo();
printf("%s", ret);

Go:

func CheckDpkgInfo() *C.char { 
return C.CString("whatever") 
}

Если я правильно понял документацию, CString должен вызывать malloc, поэтому я действительно не понимаю, почему printf segfaults. Спасибо!

1 Ответ

2 голосов
/ 01 октября 2019

Я пытаюсь вызвать функцию Go из кода C.

В чем конкретно заключается ваша проблема?


Например, это работает,

Вывод:

$ go version
go version devel +5e514b76e2 Tue Oct 1 00:02:11 2019 +0000 linux/amd64
$ gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
$ go build -buildmode=c-archive -o cstr.a cstr.go
$ gcc -pthread -o cstr cstr.c cstr.a
$ ./cstr
ret = 0x5600ca344390
whatever
$ echo $?
0
$ 

cstr.go:

package main

/*
 */
import "C"

//export CheckDpkgInfo
func CheckDpkgInfo() *C.char {
    return C.CString("whatever")
}

func main() {}

cstr.c:

#include "cstr.h"
#include <stdlib.h>
#include <stdio.h>

int main() {
    char * ret = CheckDpkgInfo();
    printf("ret = %p\n", ret);
    if (!ret) {
        return 1;
    }
    printf("%s\n", ret);
    free(ret);
    return 0;
}

Ссылка: Командаcgo


Решение:

Комментарий: даже минимальный пример вызвал segfault, но это было связано с тем, что я собираю приложение вконтейнер Docker, пока готовится c-архив снаружи. Так что дело дошло до проблемы совместимости. - ГБАТТ

...