использование fp_identify_finger из libfprint, приводящее к ошибке сегментации - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь использовать эту функцию в своем коде, чтобы выполнить поиск среди всех других моих сохраненных отпечатков, чтобы узнать, проверял ли сотрудник свой вход или выход, но все еще получал ошибку сегментации каждый раз, когда я вызываю эту функцию и программа закрывается, она просит меня положить палец, и после завершения сканирования происходит сбой. Я делаю все это в программе gtk + -2.0 C ++.

И это страница API, которую я пытаюсь использовать https://fprint.freedesktop.org/libfprint-stable/

Я уже пытался вызвать эту функцию из C

это часть кода, в которой я пытаюсь идентифицировать отпечаток пальца edlg_enroll_data после запуска процесса регистрации, и устройство в fpdev уже включено

так я объявил свои переменные

struct fp_dev *fpdev = NULL;
static struct fp_print_data *edlg_enroll_data = NULL;

так я инициализировал устройство

static gboolean enable_device()
{
    struct fp_dscv_dev **discovered_devs;
    discovered_devs = fp_discover_devs();

    if (!discovered_devs)
        return FALSE;

    g_assert(discovered_devs);

    if (discovered_devs[0]){
         fpdev = fp_dev_open(discovered_devs[0]);
         fp_dscv_devs_free(discovered_devs);
         return TRUE;
    }
    return FALSE;
} 

и вот как я инициализирую edlg_enroll_data

static void edlg_run_enroll_stage()
{
    int r;
    int passed = 0;
    struct fp_img *img = NULL;
    gchar *tmp;

    while (gtk_events_pending())
        gtk_main_iteration();

    r = fp_enroll_finger_img(fpdev, &edlg_enroll_data, &img);
    if (r < 0) {
        return;
    }

то же устройство и те же данные fp_print_data работают правильно в других функциях

struct fp_print_data **gallery;
gallery = (fp_print_data**)malloc(sizeof(*gallery) * (2));
gallery[0]=edlg_enroll_data;
gallery[1]=NULL;
size_t *size = 0;
return fp_identify_finger(fpdev, gallery, size);
and can't get past that identify function

Я ожидал, что функция возвратит Int (например, 1) и сохранит положение отпечатка пальца, которое соответствует предоставленной мной галерее. Единственное, что я думаю, это то, как я инициализирую галерею.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Хорошо, это решено, я пропустил & при передаче параметра для сохранения положения найденного отпечатка пальца следующим образом:

return fp_identify_finger(fpdev, gallery, &size);

и это решило.

0 голосов
/ 04 июля 2019

Ваши либо связанные fpdev и edlg_enroll_data остаются NULL указатели, если они не инициализированы в коде, который вы не показывали. Предполагая, что они инициализированы, ваша fp_identify_finger функция имеет объявление:

int
fp_identify_finger (struct fp_dev *dev,
                    struct fp_print_data **print_gallery,
                    size_t *match_offset);

Параметры определены как:

dev             the device to perform the scan.

print_gallery   NULL-terminated array of pointers to the prints to 
                identify against. Each one must have been previously 
                enrolled with a device compatible to the device 
                selected to perform the scan.

match_offset    output location to store the array index of the matched 
                gallery print (if any was found). Only valid if 
                FP_VERIFY_MATCH was returned.

Если dev (ваш fp_dev) или print_gallery[0] (ваш gallery[0]) не инициализированы должным образом и , это может очень легко привести к SegFault.

Кроме того, Gtk + 2 - это API C, предназначенный для компиляции с помощью компилятора C, а не C ++. Кроме того, вам рекомендуется использовать g_malloc () или g_slice_new() при распределении в программах Gtk +, поскольку проверка возврата выделения не требуется, так как программа завершается при ошибке выделения.

В вашем случае вы даже никогда не проверяете, успешен ли вызов malloc, прежде чем использовать хранилище (которое, возможно, не было выделено вообще - в этом случае, скорее всего, и SegFault) Нет необходимости бросьте возврат malloc, это не нужно. См .: Я разыгрываю результат malloc?

Без Минимальный, полный и проверяемый пример (MCVE) - это лучшие идеи, которые я могу предложить о том, где находится вероятный источник вашего SegFault. Если вам не удается проверить инициализации для fpdev и edlg_enroll_data, так же, как вы не смогли проверить, успешно ли выделено указателей для gallery, вполне вероятно, что у вас произошел сбой в одной из этих областей.

...