2015-02-10 3 views
-5

У меня есть код в C++, называемый source.cpp. И у меня есть библиотека в C. Я использую Cygwin и запускаю: g ++ source.cpp -L/cygdrive/c/cygwin/home/Win7/libpaillier -l: libpaillier.a -lgmpxx -lgmp для создания файла .exe, а затем запустить его. В конце я получаю «segmentation fault (core dumped)». Мне нужно знать, почему я получаю эту ошибку.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

+1

Функция 'paillier_keygen' нуждается в действительном указателе функции в качестве последнего аргумента. В документации предлагается два варианта выбора. – molbdnilo

+0

Я новичок в cygwin, не могли бы вы рассказать мне, как? – user13676

ответ

0

Вы объявили указатель на случайной функции (paillier_get_rand_t get_rand;), но не инициализируются его, чтобы указать на функцию , Теперь, когда вы передаете этот указатель paillier_keygen, который пытается вызвать функцию, на которую он (должен) указывать, вы получаете segfault.

Данная библиотека предоставляет, как упомянуто в @TartanLlama, две функции генерации случайных чисел, которые вы могли бы инициализировать своим указателем (или передать их непосредственно функции): paillier_get_rand_devrandom и paillier_get_rand_devurandom.

Вы также можете использовать другую функцию RNG. Просто убедитесь, что он имеет заголовок, совместимый с типом указателя функции: typedef void (*paillier_get_rand_t) (void* buf, int len); (relevant SO question). Кроме того, вы хотите, чтобы он соответствовал требованиям библиотеки, то есть генерировал случайную последовательность байтов из len байт и сохранял ее в buf.

EDIT: Я изначально неправильно код, поэтому я говорил о нескольких указателей

+0

Функция библиотеки будет выделять их. – molbdnilo

+0

Простите, что – Mints97

1

Вам необходимо пройти действительный генератор случайных чисел в качестве последнего аргумента paillier_keygen. В библиотеке представлены два варианта, которые вы можете использовать:

paillier_keygen(1024, &pu,&pr, paillier_get_rand_devrandom); 
paillier_keygen(1024, &pu,&pr, paillier_get_rand_devurandom); 
Смежные вопросы