C++ g++;正则表达式在(可能不同步)表达式上崩溃

C++ g++;正则表达式在(可能不同步)表达式上崩溃,c++,regex,c++11,crash,g++4.8,C++,Regex,C++11,Crash,G++4.8,我认为下面的程序应该要么抱怨它不能编译正则表达式,要么将其视为合法并编译得很好(我没有标准,所以我不能肯定表达式是否严格合法;当然合理的解释是可能的)。不管怎么说,g++(Ubuntu/Linaro4.8.1-10ubuntu9)4.8.1的情况是,当运行时,它很难崩溃 *** Error in `./a.out': free(): invalid next size (fast): 0x08b51248 *** 在图书馆里 问题是: a) 是臭虫,对吗?我假设(可能是错误的)标准没有说如果不

我认为下面的程序应该要么抱怨它不能编译正则表达式,要么将其视为合法并编译得很好(我没有标准,所以我不能肯定表达式是否严格合法;当然合理的解释是可能的)。不管怎么说,
g++(Ubuntu/Linaro4.8.1-10ubuntu9)4.8.1
的情况是,当运行时,它很难崩溃

*** Error in `./a.out': free(): invalid next size (fast): 0x08b51248 ***
在图书馆里

问题是:

a) 是臭虫,对吗?我假设(可能是错误的)标准没有说如果不喜欢语法,std::regex可能会崩溃。(msvc吃得很好,fwiw)

b) 如果它是一个bug,是否有一些简单的方法来查看它是否被报告过(我第一次在gnu的土地bug系统周围闲逛是很吓人的)

#包括
#包括
内部主(空)
{
常量字符*Pattern=“^(%)|”;
std::正则表达式机;
试一试{
机器=模式;
}
捕获(标准::正则表达式错误e)
{

我想把这个写在评论里,但我不能,所以

我不知道你是否已经知道了,但似乎是结尾的管道字符导致了你的问题。似乎g++给出的字符表示法(因为“^(%)| a”对我来说很好)在正则表达式试图调用free()时弄得一团糟

该标准(或至少是我正在阅读的在线草案)声称:

28.8
Class template basic_regex
[re.regex]

1 For a char-like type charT, specializations of class template basic_regex represent regular expressions
constructed from character sequences of charT characters. In the rest of 28.8, charT denotes a given char-
like type. Storage for a regular expression is allocated and freed as necessary by the member functions of
class basic_regex.

2 Objects of type specialization of basic_regex are responsible for converting the sequence of charT objects
to an internal representation. It is not specified what form this representation takes, nor how it is accessed by
algorithms that operate on regular expressions.
[ Note: Implementations will typically declare some function
templates as friends of basic_regex to achieve this — end note ]
后来呢,

basic_regex& operator=(const charT* ptr);

3 Requires: ptr shall not be a null pointer.

4 Effects: returns assign(ptr).
所以除非g++认为const char*Pattern=“|”是一个空ptr(我想不是…), 我想是虫子吧


编辑:顺便说一下,连续的| |(即使不在末尾)似乎也给我造成了一个分段错误。

我要说的是,正则表达式解析器中有一个bug,因为它应该做的是匹配任何东西。管道字符指示正则表达式解析器匹配它两侧的表达式。因为在你的情况下,右边是空的,所以它应该匹配任何东西。我猜你想要匹配一个pipe charachter,因此应该转义它,它应该可以工作。顺便问一下,正则表达式只是一个测试,还是您正在尝试做什么?
在gcc-4.8.1的libstdc++中是不起作用的。如果您可以使用LLVM的libc++,请使用它。否则-boost。regex@ClasG在过去(在肯·汤普森的精彩算法发表后不久),使用带有空参数的
|
来匹配epsilon(零个字符),有效地提供了一个
运算符,而无需保留另一个特殊字符。此错误源于通过编程从模式/类型表生成基于正则表达式的词法分析器的代码。我将其修改为二进制搜索另一个正则表达式错误,并错误地以
|
结尾。@CubBI谢谢!我要反驳说4.8-1声明ReGEX支持,但是我看到我的版本是0.0.1!好的,现在我只需要知道如何获得一个4.4.2功能的系统。这个项目的一部分是为了探索在两个主要编译器中准备好黄金时段C++ 11的支持。(比BJARNE想象的少,当它涉及正则表达式)时,我对替代的LIBs不感兴趣,但可以用香草C++ 11来做。这可能是我所能得到的答案,它至少增强了我的信心:正则表达式语法错误不被归类为“未定义行为”。。因此,我也不能对其他人的评论发表评论,但关于您对@Cubbi的评论,我昨天刚刚在群集上安装了gcc-4.8.2,但没有root访问权限,所以如果您仍希望这样做,我可能可以帮您?
basic_regex& operator=(const charT* ptr);

3 Requires: ptr shall not be a null pointer.

4 Effects: returns assign(ptr).