GLib 正则表达式匹配给出特定匹配和模式的分段错误
GLib regex match gives segmentation fault on specific matches and patterns
在我的程序中,我扫描文件中的某些文本。经过几周的调试,我发现文件中的某些文本行会根据使用的正则表达式模式给出分段错误。例如,我发现以下文本行导致分段错误
#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>) f4hren. 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>) f4hren. 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_strescape 在这种情况下会有所帮助,因为它只是转义“\”(和其他特殊字符),这将防止 g_regex_match
发生段错误。
关于崩溃:这是因为 GRegex
方法不接受无效的 UTF-8 输入。这记录在 introduction to GRegex
, but could be documented more obviously.
中
4
不是有效的 UTF-8。此处正确的解决方法是将您拥有的任何输入字符编码转换为 UTF-8,使用(例如)g_locale_to_utf8()
or g_convert()
. GLib only accepts UTF-8 encoded strings for all of its functions (unless documented otherwise), so you will likely run into problems like this again unless you convert or validate 输入的所有字符串。
在我的程序中,我扫描文件中的某些文本。经过几周的调试,我发现文件中的某些文本行会根据使用的正则表达式模式给出分段错误。例如,我发现以下文本行导致分段错误
#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>) f4hren. 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>) f4hren. 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_strescape 在这种情况下会有所帮助,因为它只是转义“\”(和其他特殊字符),这将防止 g_regex_match
发生段错误。
关于崩溃:这是因为 GRegex
方法不接受无效的 UTF-8 输入。这记录在 introduction to GRegex
, but could be documented more obviously.
4
不是有效的 UTF-8。此处正确的解决方法是将您拥有的任何输入字符编码转换为 UTF-8,使用(例如)g_locale_to_utf8()
or g_convert()
. GLib only accepts UTF-8 encoded strings for all of its functions (unless documented otherwise), so you will likely run into problems like this again unless you convert or validate 输入的所有字符串。