我试图更好地理解g ++(GCC)4.9.2(Linux)上None
中的正则表达式扫描器实现(std::__details::_Scanner<>
)。
在POSIX语言环境中运行扫描程序运行正常。但是,当我切换到UTF-8语言环境时,我开始在<regex>
中获得分段错误。
一些示例代码可以再现扫描仪中发生的情况,如下所示。
std::ctype::narrow
将区域设置设置为&#34; en_GB.UTF-8&#34;而不是&#34; POSIX&#34; (在Linux上)导致分段错误。
这是一个错误还是错过了一些基本的东西(我对C ++的经验是有限的,我在C ++上与语言环境相关的经验实际上是不存在的)?
更新
问题代码是这个(#include <iostream>
#include <locale>
typedef std::ctype<char> CTYPE;
int
main ()
{
const char* p;
const char* s = "asdb";
const CTYPE& ctype(std::use_facet<CTYPE>(std::locale("POSIX")));
for (p = s; *p != '\0'; ++p)
{
char ch = ctype.narrow(*p,'\0');
std::cout << *p << ": " << (int) ch << std::endl;
}
}
):
/usr/include/c++/4.9.2/bits/locale_facets.h
似乎存在许多问题:
对于除POSIX(UTF8或其他)以外的语言环境,char
narrow(char_type __c, char __dfault) const
{
if (_M_narrow[static_cast<unsigned char>(__c)])
return _M_narrow[static_cast<unsigned char>(__c)];
const char __t = do_narrow(__c, __dfault);
if (__t != __dfault)
_M_narrow[static_cast<unsigned char>(__c)] = __t;
return __t;
}
映射表返回jiberish(例如_M_narrow
语言环境为french
返回'
。
当a
条目为零并且_M_narrow
被调用时,似乎相应的vtable条目无效,因为错误指令是do_narrow
(大多数是NULL但偶尔会一些随机值)。
所以我将这个标记为GCC或libstd ++ bug。