GLib正则表达式匹配在特定匹配和模式上提供分段错误

时间:2018-04-21 01:52:44

标签: c++ regex glib

在我的程序中,我扫描文件中的某些文字。经过数周的调试后,我发现文件中的某些文本行会根据所使用的正则表达式模式产生分段错误。例如,我发现以下文本行导致分段错误

#include <glib.h>

int main()
{
    GRegex* regex = g_regex_new("\\bhtml\\b", G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY, NULL);
    //The following line causes a segmentation fault
    g_regex_match(regex, "<code>USR1</code>) f\374hren. Ersteres ist ein schwerer Fehler,", G_REGEX_MATCH_NOTEMPTY, NULL);
    return 0;
}

以下使用不同模式不会导致分段错误

#include <glib.h>

int main()
{
    GRegex* regex = g_regex_new("html", G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY, NULL);
    g_regex_match(regex, "<code>USR1</code>) f\374hren. Ersteres ist ein schwerer Fehler,", G_REGEX_MATCH_NOTEMPTY, NULL);
    return 0;
}

正则表达式模式与字符串中 \ 374 的组合会导致分段错误。我注意到,如果我用 \\ 374 手动转义 \ 374 ,则不会发生分段错误。

该文本行的来源来自文件:https://httpd.apache.org/docs/2.4/de/stopping.html

对于这种特殊情况,当我读取此文件并将文本行存储在字符串中时,它将以 \ 374 的形式存储在字符串中,而不是存储为ü

如何解决这个问题,例如,如果我要阅读包含数百行可能包含任何内容的数千个文件,我可以使用任何正则表达式模式并避免由此引起的分段错误?

2 个答案:

答案 0 :(得分:2)

关于崩溃:这是因为GRegex方法不接受无效的UTF-8输入。这在introduction to GRegex中有记录,但could be documented more obviously

\374无效UTF-8。这里正确的解决方法是使用(例如)g_locale_to_utf8()g_convert()将您拥有的任何输入字符编码转换为UTF-8。 GLib只接受UTF-8编码的字符串用于其所有功能(除非另有说明),因此除非您在输入时转换或validate所有字符串,否则您可能会再次遇到此类问题。

答案 1 :(得分:1)

g_strescape在这种情况下会有所帮助,因为它只是逃避了&#39; \' (和其他特殊字符),这将阻止g_regex_match分裂。