2015-02-10 114 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);