从libfprint使用fp_identify_finger给出分段错误

时间:2019-07-03 22:54:20

标签: c++ fingerprint

我正在尝试在代码中使用此功能,以在所有其他保存的打印件中执行搜索,以了解员工是否确实检查了他的出入,但每次我调用此功能时仍会遇到细分错误然后程序关闭,它要求我放开手指,一旦完成扫描,它就会崩溃。我正在gtk + -2.0 C ++程序中完成所有这些工作。

这是我尝试使用的https://fprint.freedesktop.org/libfprint-stable/ API的页面

我已经尝试从C调用此函数

这是代码的一部分,在运行注册过程并且fpdev中的设备已启用之后,我尝试识别edlg_enroll_data的指纹

这就是我声明变量的方式

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 :(得分:0)

您与之相关的fpdevedlg_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是C API,用于使用C编译器而不是C ++进行编译。进一步建议您在Gtk +程序内进行分配时使用g_malloc ()g_slice_new(),因为不必检查分配的返回值,因为程序会在分配失败时终止。

对于您来说,在使用存储之前,您甚至都不会检查对malloc的调用是否成功(可能根本没有分配过,在这种情况下也可能会出现SegFault)。需要强制返回malloc的返回值,则没有必要。参见:Do I cast the result of malloc?

在没有A Minimal, Complete, and Verifiable Example (MCVE)的情况下,这是我可以提供的关于SegFault可能来源所在的最佳想法。如果您未能验证fpdevedlg_enroll_data的初始化,同样无法验证gallery的指针分配是否成功,则很可能失败了在其中一个地区。

答案 1 :(得分:0)

好了,我解决了这个问题,在传递参数来存储找到的指纹的位置时,我缺少一个&:

return fp_identify_finger(fpdev, gallery, &size);

这解决了它。