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

Posted

技术标签:

【中文标题】GLib 正则表达式匹配在特定匹配和模式上给出分段错误【英文标题】:GLib regex match gives segmentation fault on specific matches and patterns 【发布时间】:2018-04-21 01:52:44 【问题描述】:

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

#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 的形式存储在字符串中,而不是存储为 ü强>。

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

【问题讨论】:

在使用g_regex_match 评估它之前,您不能在源字符串上使用g_strescape 吗? 是的。它适用于此。问这个问题大约 15 分钟后发现 -.- 虽然如果你写下答案,我会将其标记为答案。问了很多问题,然后在我提出问题后继续尝试几天或几分钟后回答自己,我感觉很糟糕。谢谢。 好的,我已经写了一个答案。我自己遇到过几次这种“尴尬”,但我还是写了一个答案,因为它可能对其他人有用。只要它不经常发生;) 【参考方案1】:

关于崩溃:这是因为 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 所有字符串。

【讨论】:

【参考方案2】:

g_strescape 在这种情况下会有所帮助,因为它只是转义 '\'(和其他特殊字符),这将防止 g_regex_match 出现段错误。

【讨论】:

以上是关于GLib 正则表达式匹配在特定匹配和模式上给出分段错误的主要内容,如果未能解决你的问题,请参考以下文章

python 正则表达式

python基础学习(十三)

python基础学习笔记(十三)

正则表达式 - 如何匹配除特定模式之外的所有内容

正则表达式:匹配除特定模式之外的所有内容

寻找正则表达式以匹配特定模式