AB
unsafe.Pointer
. Поэтому лишние данные захватываются.Size: a a a
AB
unsafe.Pointer
. Поэтому лишние данные захватываются.Z
"after sign”
захватывает.АИ
C.GoString(data2)
узнает длину куска памяти передаваемую через unsafe.Pointer?AB
AB
C.GoString(data2)
АИ
static inline unsigned long sign_data(int flags, char *inData, unsigned char *outSign) {
int inDataLength = strlen((const char*)inData);
int outSignLength = 50000 + 2*inDataLength;
int inSignLength = 50000 + 2*inDataLength;
outSign[outSignLength];
unsigned char inSign[inSignLength];
inSign[inSignLength];
return kc_funcs->SignData((char*)alias, flags, inData, inDataLength, inSign, inSignLength, outSign, &outSignLength);
}
Это моя обертка для C функцииAB
static inline unsigned long sign_data(int flags, char *inData, unsigned char *outSign) {
int inDataLength = strlen((const char*)inData);
int outSignLength = 50000 + 2*inDataLength;
int inSignLength = 50000 + 2*inDataLength;
outSign[outSignLength];
unsigned char inSign[inSignLength];
inSign[inSignLength];
return kc_funcs->SignData((char*)alias, flags, inData, inDataLength, inSign, inSignLength, outSign, &outSignLength);
}
Это моя обертка для C функцииАИ
2020/12/13 04:33:56 before sign
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x462fc7]
runtime stack:
runtime.throw(0x7e2a74, 0x2a)
/usr/local/go/src/runtime/panic.go:1116 +0x72
runtime.sigpanic()
/usr/local/go/src/runtime/signal_unix.go:704 +0x4ac
runtime.gcBgMarkWorker.func1(0xc000001980, 0xc0003cf550, 0xc000020000)
/usr/local/go/src/runtime/mgc.go:1911 +0x47
runtime.park_m(0xc000001980)
/usr/local/go/src/runtime/proc.go:2826 +0xc2
runtime.mcall(0x800000)
/usr/local/go/src/runtime/asm_amd64.s:318 +0x5b
AB
AB
АИ
result C.uchar
как один символ, а вы к нему обращаетесь как к массиву.АИ
func SignData(data string, flags int) (string, error) {
var result C.char
cdata := C.CString(data)
cflags := C.int(flags)
log.Println("before sign")
if C.sign_data(cflags, cdata, &result) != 0 {
return "", GetLastErrorString()
}
C.free(unsafe.Pointer(cdata))
log.Println("after sign")
return C.GoString(&result), GetLastErrorString()
}
АИ
AB
АИ
MIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIafter sign
Ожидаю: MIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZI==
AB
MIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIafter sign
Ожидаю: MIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZI==
АИ