所以我使用 PBC 0.5.14 为我的研究工作开发软件。我需要使用类型i 配对。但是,当我尝试使用element_to_byte()函数导出元素时,它会引发分段错误。后来,我继续检查我在组G1中定义的元素的大小(使用element_length_in_bytes())。它被证明是零。如果我将类型i 配对替换为键入配对(这也是PBC中的对称配对),则代码可以正常工作。以下是显示故障的代码段。
#include <stdio.h>
#include <stdlib.h>
#include "pbc-0.5.14/include/pbc.h"
pairing_t pairing;
char param[MAX_BUF];
unsigned char buffer[MAX_BUF];
element_t P;
void InitializePairing(){
FILE* stream = fopen("pbc-0.5.14/param/i.param", "r");
size_t count = fread(param, 1, MAX_BUF, stream);
if(!count){
printf("Input Error!!\n");
}
pairing_init_set_buf(pairing, param, count);
}
int main(int argc, char const *argv[])
{
InitializePairing();
element_init_G1(P, pairing);
element_random(P);
printf("%d\n", element_length_in_bytes(P));
element_to_bytes(buffer,P);
return 0;
}
这是gdb backtrace的输出。
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x000000000040087e in element_to_bytes (data=0x6014a0 <buffer> "", e=0x601080 <P>) at pbc-0.5.14/include/pbc_field.h:476
#2 0x000000000040096d in main (argc=1, argv=0x7fffffffdbe8) at pbc_test_i.c:31
(gdb)
答案 0 :(得分:0)
代码为:
static inline int element_to_bytes(unsigned char *data, element_t e) {
return e->field->to_bytes(data, e); // line 476
}
从此代码和崩溃堆栈中,可以安全地得出结论e->field == NULL
。 e->field
分配了element_init
:
static inline void element_init(element_t e, field_ptr f) {
e->field = f;
f->init(e);
}
由element_init_G1
调用。然后必须得出结论,您初始化pairing
的方式是错误的。
请注意pairing_init_set_buf
可能会返回错误,您忽略了该错误(但不应该)。