2015-02-10 109 views
-5

我在C++中有一个名为source.cpp的代码。我使用Cygwin并运行:g ++ source.cpp -L/cygdrive/c/cygwin/home/Win7/libpaillier -l:libpaillier.a -lgmpxx -lgmp创建一个.exe文件,然后运行。最后,我得到“分段错误(核心转储)”。我需要知道为什么我得到这个错误。g ++:分段错误(核心转储)

Source.cpp:

#include<iostream> 
#include<gmp.h> 
#include <gmpxx.h> 

using namespace std; 

#include <string> 
extern "C"{ 
#include<paillier.h> 
} 
#include<math.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    paillier_pubkey_t* pu;//The public key 
    paillier_prvkey_t* pr;//The private key 
    paillier_get_rand_t get_rand; 
    paillier_keygen(1024, &pu,&pr, get_rand); 
    return 0; 
} 

Paillier库:http://acsc.cs.utexas.edu/libpaillier/

+1

你试过使用调试器吗? – TartanLlama 2015-02-10 12:31:48

+1

paillier_keygen函数需要一个有效的函数指针作为其最后一个参数。该文档建议两个供您选择。 – molbdnilo 2015-02-10 12:34:09

+0

我是cygwin的新手,你能告诉我怎么做吗? – user13676 2015-02-10 12:34:33

回答

0

您已经声明指向一个随机函数(paillier_get_rand_t get_rand;),但没有初始化它在功能点。现在,当你将这个指针传递给paillier_keygen试图调用它应该指向的函数时,你会得到一个段错误。

作为@TartanLlama提到的,有问题的库提供了两个随机数生成函数,您可以初始化指针(或直接将它们传递给函数):paillier_get_rand_devrandompaillier_get_rand_devurandom

您也可以使用另一个RNG功能。只要确保它的头部与所讨论的函数指针类型兼容即可:typedef void (*paillier_get_rand_t) (void* buf, int len);relevant SO question)。另外,您希望它符合库的要求,即生成一个len字节的随机字节序列并将其存储在buf中。

编辑:我原来是看错你的代码,这就是为什么我谈过几个指针

+0

库函数将分配它们。 – molbdnilo 2015-02-10 12:34:34

+0

对不起 – Mints97 2015-02-10 12:35:01

1

你需要通过一个有效的随机数生成器的最后一个参数paillier_keygen。库提供了两个你可以使用的:

paillier_keygen(1024, &pu,&pr, paillier_get_rand_devrandom); 
paillier_keygen(1024, &pu,&pr, paillier_get_rand_devurandom);