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

问题描述

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

可能程序存在不止一个错误,如果可以,麻烦一一指出
如果哪位高手能帮忙让程序跑出结果,我把剩下的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 testn");

//generate system parameters
element_random(g);
element_printf("system parameter g = %Bn", g);

//generate private key
element_random(secret_key);
element_printf("private key = %Bn", secret_key);

//compute corresponding public key
element_pow_zn(public_key, g, secret_key);
element_printf("public key = %Bn", 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 = %Bn", 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 = %Bn", 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 = %Bn", sig);

pbc_free(data);
}

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

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

if (!element_cmp(temp1, temp2)) {
printf("signature verifiesn");
} 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 = %Bn", sig);

pairing_apply(temp1, sig, g, pairing);
if (!element_cmp(temp1, temp2)) {
    printf("signature verifies on first guessn");
} else {
    element_invert(temp1, temp1);
    if (!element_cmp(temp1, temp2)) {
    printf("signature verifies on second guessn");
    } 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 verifyn");
} 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;

}

解决方案

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

解决方案二:

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

时间: 2024-08-07 13:17:46

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

gtk+-在ubuntu下编译一个开源软件,./configure时出现错误,求指教

问题描述 在ubuntu下编译一个开源软件,./configure时出现错误,求指教 显示的错误: checking for libgnome-2.0 >= 2.0.0 libgnomeui-2.0 >= 2.0.0 gtk+-2.0 >= 2.4.0 gnome-vfs-2.0 >= 2.6.0 libglade-2.0 >= 2.3.6... Package libgnome-2.0 was not found in the pkg-config search path.

ubuntu_14.04下gcc编译问题

问题描述 ubuntu_14.04下gcc编译问题 main函数体仅打印hello,world,gcc发现如下问题,不解: 头文件无#include,gcc不报错而报警告,为什么? 函数体中使用"exit(EXIT_SUCCESS);"代替"return(0);"需要使用头文件#include .如果头文件不加入,会报错 : "hello.c:9:7: error: 'EXIT_SUCCESS' undeclared (first use in this

ubuntu 13.10编译安装mono环境(二)_Linux

准备工作 先在VS2012上编译一个winform,代码如下: using System; using System.Windows.Forms; namespace FormsTest { static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.S

Android内核源码 在Ubuntu上下载,编译,安装

从源代码树下载下来的最新Android源代码,是不包括内核代码的,也就是Android源代码工程默认不包含Linux Kernel代码,而是使用预先编译好的内核,也就是prebuilt/android-arm/kernel/kernel-qemu文件.那么,如何才能DIY自己的内核呢?这篇文章一一道来. 一. 首选,参照前一篇在Android源码 在Ubuntu上下载,编译和安装准备好Android源代码目录. 二. 下载Linux Kernel for Android源代码. 1. 使用GIT

Linux下如何用GCC编译动态库

  本文主要解决以下几个问题 1 为什么要使用库? 2 库的分类 3 创建自己的库 或许大家对自己初学 Linux时的情形仍记忆尤新吧.如果没有一个能较好的解决依赖关系的包管理器,在Linux下安装软件将是一件及其痛苦的工作.你装a包时,可能会提示你要先装b包,当你费尽心力找到b包时,可能又会提示你要先安装c包.我就曾被这样的事搞的焦头烂额,至今一提起rpm仍心有余悸,头皮发麻.说是一朝被蛇咬,十年怕井绳怕也不为过. Linux下之所以有这许多的依赖关系,其中一个开发原则真是功不可没.这个原则就

gcc vc++6.0-同样代码VC6.0结果正确,GCC编译运行结果不正确,原因是什么呢?谢谢!

问题描述 同样代码VC6.0结果正确,GCC编译运行结果不正确,原因是什么呢?谢谢! #include int main() { char deno[1000]={''},num,i=0,remain=0; scanf("%s %d",deno,&num); //获取被除数.除数 if(!num) return (-1); while(deno[i]!='') deno[i++]-='0'; //转换成数字 deno[i]='#'; //结束标志 i=0; while(deno

GCC 编译使用动态链接库和静态链接库的方法

1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用. 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已.因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题. 首先就是系统空间被浪费了.

c语言-Linux下使用gcc编译c11程序是不是过于麻烦了?

问题描述 Linux下使用gcc编译c11程序是不是过于麻烦了? 每次都要输入-std=c11 是不是过于麻烦了?怎么让它默认为-std=c11? 解决方案 因为它默认是c89等标准,所以需要指定 你可以写一个makefile ,这样每次只用make来编译

GCC 编译使用动态链接库和静态链接库

1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已.因为静态库被链接后库