2 sinat 28845705 sinat_28845705 于 2015.06.10 17:42 提问

在ubuntu使用gcc编译一个基本签名算法出现 段错误 核心已转储 麻烦给看看程序有什么错误。 50C

可能程序存在不止一个错误,如果可以,麻烦一一指出
如果哪位高手能帮忙让程序跑出结果,我把剩下的140C送给他作为感谢!

#include "pbc.h"

int main(void)
{
pairing_t pairing;
element_t g, h;
element_t public_key, sig;
element_t secret_key;
element_t temp1, temp2;
char *string1;

pairing_init_set_str(pairing, string1);

element_init_G2(g, pairing);
element_init_G2(public_key, pairing);
element_init_G1(h, pairing);
element_init_G1(sig, pairing);
element_init_GT(temp1, pairing);
element_init_GT(temp2, pairing);
element_init_Zr(secret_key, pairing);

printf("Short signature test\n");

//generate system parameters
element_random(g);
element_printf("system parameter g = %B\n", g);

//generate private key
element_random(secret_key);
element_printf("private key = %B\n", secret_key);

//compute corresponding public key
element_pow_zn(public_key, g, secret_key);
element_printf("public key = %B\n", public_key);

//generate element from a hash
//for toy pairings, should check that pairing(g, h) != 1
element_from_hash(h, "hashofmessage", 13);
element_printf("message hash = %B\n", h);

//h^secret_key is the signature
//in real life: only output the first coordinate
element_pow_zn(sig, h, secret_key);
element_printf("signature = %B\n", sig);

{
int n = pairing_length_in_bytes_compressed_G1(pairing);
//int n = element_length_in_bytes_compressed(sig);
int i;
unsigned char *data = pbc_malloc(n);

element_to_bytes_compressed(data, sig);
printf("compressed = ");
for (i = 0; i < n; i++) {
    printf("%02X", data[i]);
}
printf("\n");

element_from_bytes_compressed(sig, data);
element_printf("decompressed = %B\n", sig);

pbc_free(data);
}

//verification part 1
pairing_apply(temp1, sig, g, pairing);
element_printf("f(sig, g) = %B\n", temp1);

//verification part 2
//should match above
pairing_apply(temp2, h, public_key, pairing);
element_printf("f(message hash, public_key) = %B\n", temp2);

if (!element_cmp(temp1, temp2)) {
printf("signature verifies\n");
} else {
printf("*BUG* signature does not verify *BUG*\n");
}

{
int n = pairing_length_in_bytes_x_only_G1(pairing);
//int n = element_length_in_bytes_x_only(sig);
int i;
unsigned char *data = pbc_malloc(n);

element_to_bytes_x_only(data, sig);
printf("x-coord = ");
for (i = 0; i < n; i++) {
    printf("%02X", data[i]);
}
printf("\n");

element_from_bytes_x_only(sig, data);
element_printf("de-x-ed = %B\n", sig);

pairing_apply(temp1, sig, g, pairing);
if (!element_cmp(temp1, temp2)) {
    printf("signature verifies on first guess\n");
} else {
    element_invert(temp1, temp1);
    if (!element_cmp(temp1, temp2)) {
    printf("signature verifies on second guess\n");
    } else {
    printf("*BUG* signature does not verify *BUG*\n");
    }
}

pbc_free(data);
}

//a random signature shouldn't verify
element_random(sig);
pairing_apply(temp1, sig, g, pairing);
if (element_cmp(temp1, temp2)) {
printf("random signature doesn't verify\n");
} else {
printf("*BUG* random signature verifies *BUG*\n");
}

element_clear(sig);
element_clear(public_key);
element_clear(secret_key);
element_clear(g);
element_clear(h);
element_clear(temp1);
element_clear(temp2);
pairing_clear(pairing);
return 0;

}

2个回答

zerglurker
zerglurker   2015.06.10 22:26

你首先每一个函数调用加一条语句:
printf("%s(%d)\n",__FILE__,__LINE__);
然后看看输出的是什么
这句话的含义是打印出当前文件以及当前的行数
行数会随着行所在代码的行数而变化
我怀疑
char *string1;
这句有问题
pairing_init_set_str(pairing, string1);使用了该变量
因为你声明的是字符串指针,后面没有释放动作。
所以可见上面这个函数对这个指针没有分配内存
你可以试着改成
char string1[1024];
试一试

oyljerry
oyljerry   Ds   Rxr 2015.06.10 19:13

直接用gdb先看一下core dump在什么位置,多数是指针等操作有问题

sinat_28845705
sinat_28845705 怎么看 可以告诉我指令吗?
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
解决Linux c语言运行时候“段错误 (核心已转储)”问题-采用gdb 解决
编译没有警告,没有错误,运行就打印 段错误 (核心已转储) 网上找了一下,都是各种问题,都推荐用gdb 调试解决,咱也来趁机学习gdb一下。 gcc+gdb)输入命令行 运行 sudo apt-get install build-essential build-essential包含gcc和gdb等工具,是C语言的开发包。 安装完了可以执行 一般来说GDB主要调试的
Linux 下运行 C++ 程序出现 “段错误(核心已转储)”
Linux 下运行 C++ 程序出现 “段错误(核心已转储)”Linux下写C++程序出现“段错误(核心已转储)”的问题:段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个...
Ubuntu——段错误 核心已转储
http://blog.sina.com.cn/s/blog_75bf554501019cvt.html
运行 MAttNets 程序的过程中出现 segmentation faults (core dumped)·「核心已转储」问题
现在觉得可能是由于虚拟环境配置的问题。因为在一个环境中可以跑通,而在另一个虚拟环境中不能跑通因为这个问题太过 general,能导致这个问题的原因有太多了所以如果遇到这个问题, 感觉还是重新配置一遍虚拟环境比较好。这时候就体现出了虚拟环境的好处啦。...
ubuntu段错误(核心已转储)
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。这种看起来比较困难,因为没有任何的栈、trace信息输出。该种类型的错误...
段错误 (核心已转储)
在ubuntu编译一个要用到opencv的程序。 我明明安装好了opencv库,执行gcc `pkg-config --libs --cflags opencv` test.c  -o  test时却出现这样一个问题:undefined reference to `cvLoadImage' 查了很久没查到解决方法,后来调整了一下顺序变成:gcctest.c  -o  test `p
段错误(核心已存储)
今天在LINUX下写程序出现了“段错误(核心已存储)”这个错误,查了一下资料,发现有如下几种可能 1.内存访问出错或是非法访问 如我们经常会出现的数组越界或是程序试图访问内核段内存而出现的错误。 如果是该错误,只需仔细检查程序并改正即可。 2.栈溢出 LINUX默认给一个进程分配的栈空间大小为8M,我们可以通过下述指令查看以及修改 ulimit -a ulimit -s XX
段错误(核心已转储)问题的分析方法
通过实例详细说明了linux 下Segmentation fault(core dumped)(段错误(核心已转储))的分析方法,段错误产生的必要条件,以及core dumped文件的存储,命名等。
“段错误 (核心已转储) ”一种可能原因及其解决方法
终端在运行的时候总是出现 “段错误 (核心已转储) ” 栈空间用来存储数组等数据,那么段错误就应该是我存储的数组超过了它所在段的大小,于是在的程序执行的过程中一到跟大数组相关的步骤就会出现段错误的提示(SIGSEGV: Segmentation fault)。      linux下应用  ulimit -a 命令查看当前栈空间大小,得到:      8012        
ubuntu 14.04 处理 通过anaconda启动jupyter报错
笔者在Ubuntu通过安装来anaconda来使用jupyter notebook,anaconda是目前python数据分析最好用的发行版,集成了很多常用的数据分析模块,如果是自己安装python环境,坑很多的。 在linux下安装也很简单,将anaconda.sh上传到linux后,执行 bash anaconda.sh,根据提示安装即可,最后一部是询问是否将python加入环境变量,选择y