使用utf-8语言环境的std :: ctype :: narrow分段错误

时间:2016-02-26 23:46:38

标签: c++ c++11

我试图更好地理解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。

0 个答案:

没有答案