46: `(dryad-bibo/v)[0-9].[0-9]' 的正则表达式错误 17,(匹配失败)

46: regex error 17 for `(dryad-bibo/v)[0-9].[0-9]', (match failed)

我正在尝试使用 libmagic 和以下代码来确定多种类型文件的 MIME 类型:

auto handle = ::magic_open(MAGIC_MIME_TYPE);
::magic_load(handle, NULL);

// Both of these fail with the same error
// file_path being a const char* with the path to the file.
auto type2 = ::magic_file(handle, file_path);

// svg_content being an std::vector<char> with the contents of the file.
//auto type2 = ::magic_buffer(handle, svg_content.data(), svg_content.size()); 

if(!type2)
{
   std::cout << magic_error(handle) << std::endl;
}
    
::magic_close(handle);

但是对于我尝试的任何文件或缓冲区,我都收到正则表达式错误,或者是或类似于:

46: regex error 17 for `(dryad-bibo/v)[0-9].[0-9]', (match failed)

例如这个 .svg 文件:

<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-no" viewBox="0 0 640 480">
  <path fill="#ed2939" d="M0 0h640v480H0z"/>
  <path fill="#fff" d="M180 0h120v480H180z"/>
  <path fill="#fff" d="M0 180h640v120H0z"/>
  <path fill="#002664" d="M210 0h60v480h-60z"/>
  <path fill="#002664" d="M0 210h640v60H0z"/>
</svg>

到目前为止我尝试过的:

我链接的是本地构建的 libmagic 版本,构建时是否遗漏了什么?是否有任何呼叫不正确或我遗漏了什么?

我在尝试 运行 本地编译的相关文件二进制文件时遇到类似的错误。而当我使用默认可用的文件命令时,我确实得到 image/svg+xml 作为输出。

编辑

为了构建 libmagic(适用于 macOS 和 Ubuntu),我遵循了以下步骤:

更新

看起来这个文件底部的正则表达式导致了问题(至少对于 svg):

https://github.com/file/file/blob/b56b58d499dbe58f2bed28e6b3c297fe7add992e/magic/Magdir/dataone

更新 2

发生了一些奇怪的事情;在我让它工作的系统上,magic_version() 报告 540,如预期的那样。但是在出现此错误而失败的系统上,magic_version() 报告 538.

这对我来说意义不大,因为我在系统本身的任何地方都找不到那个版本,当我在构建库中 运行 ./file --version 时,它报告 file-5.40

测试于 Ubuntu 20.04.:

克隆存储库

git clone git@github.com:file/file.git
cd file/

在 repo 的新克隆中试试这个:

autoreconf -f -i
./configure --disable-silent-rules
make -j4
make -C tests check

然后看看有没有报错。使用 make install 安装后,抓取一些名为“test.xml”的有效 xml 文件并将其与此 main.c:

一起放入某个文件夹
#include <stdio.h>
#include <magic.h>

int main(void)
{
    char *actual_file = "test.xml";
    const char *magic_full;
    magic_t magic_cookie;

    /* MAGIC_MIME tells magic to return a mime of the file,
       but you can specify different things */
    magic_cookie = magic_open(MAGIC_MIME);

    if (magic_cookie == NULL) {
        printf("unable to initialize magic library\n");
        return 1;
    }

    printf("Loading default magic database\n");

    if (magic_load(magic_cookie, NULL) != 0) {
        printf("cannot load magic database - %s\n", magic_error(magic_cookie));
        magic_close(magic_cookie);
        return 1;
    }

    magic_full = magic_file(magic_cookie, actual_file);
    printf("%s\n", magic_full);
    magic_close(magic_cookie);
    return 0;
}

(感谢 vivithemage。)

编译并尝试:

$ gcc main.c -lmagic
$ ./a.out 
Loading default magic database
text/xml; charset=us-ascii

如果它在您的系统上不起作用,请在 project's bugtracker 上报告错误,并说明您的 OS 和体系结构。您可以尝试通过从您在更新中找到的文件中删除有问题的记录来修复您的问题。

非常不满意的答案,但它链接到 GoogleTest 以某种方式导致此错误,甚至 运行 没有任何测试,只是链接到它。

我改为使用 Catch2,问题已解决。