Size: a a a

2020 December 13

AB

Andrey Burov in Go-go!
Zver
По мне что-то не так с манипуляциями с unsafe.Pointer. Поэтому лишние данные захватываются.
как они повлияют на чисто гошный print?
источник

Z

Zver in Go-go!
Andrey Burov
как они повлияют на чисто гошный print?
Кусок памяти с  "after sign” захватывает.
источник

АИ

Арман Исмаилов... in Go-go!
Zver
Вообще как C.GoString(data2) узнает длину куска памяти передаваемую через unsafe.Pointer?
Я только начинающий даже не понял о чем речь🙄
источник

AB

Andrey Burov in Go-go!
в каком месте?
источник

Z

Zver in Go-go!
data2 := (*C.char)(unsafe.Pointer(&result))
источник

Z

Zver in Go-go!
И потом C.GoString(data2)
источник

AB

Andrey Burov in Go-go!
Zver
И потом C.GoString(data2)
это NULLterminated string
источник

АИ

Арман Исмаилов... in Go-go!
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

Andrey Burov in Go-go!
Арман Исмаилов
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 функции
сделайте бенеч на это дело, если там есть out of memory внутри, то у вас будеш шанс его поймать
источник

АИ

Арман Исмаилов... in Go-go!
OOM не поймал. Но была одна паника:
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

Andrey Burov in Go-go!
это не OOM
источник

Z

Zver in Go-go!
У вас result C.uchar как один символ, а вы к нему обращаетесь как к массиву.
источник

AB

Andrey Burov in Go-go!
ааа, фу
источник

АИ

Арман Исмаилов... in Go-go!
Zver
У вас result C.uchar как один символ, а вы к нему обращаетесь как к массиву.
В каком месте?👀
источник

АИ

Арман Исмаилов... in Go-go!
Переписал функцию теперь unsafe. Pointer выпилил, вместо unsigned char использую char:
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()
}
источник

АИ

Арман Исмаилов... in Go-go!
Вывод не поменялся
источник

AB

Andrey Burov in Go-go!
еще раз повтори плиз, что выводит и что ты ожидаешь?
источник

АИ

Арман Исмаилов... in Go-go!
Выводит: MIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIafter sign
Ожидаю: MIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZI==
источник

AB

Andrey Burov in Go-go!
Арман Исмаилов
Выводит: MIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIafter sign
Ожидаю: MIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZIMIISdgYJKoZIhvcNAQcCoIISZzCCEmMCAQExDTALBglghkgBZQMEAgEwQwYJKoZI==
это baset64, есть мысли откуда?
источник

АИ

Арман Исмаилов... in Go-go!
Библиотека отдает данные в base64 на выходе
источник