首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SWIG错误编码的字符串导致Python崩溃

SWIG错误编码的字符串导致Python崩溃
EN

Stack Overflow用户
提问于 2019-04-11 18:18:50
回答 1查看 260关注 0票数 -1

我有一个问题,如果我在std::string中传递了一个错误的编码字符串,所有处理字符串的SWIG包装器都会崩溃,我指的是包含èé等字符的字符串,这些字符对当前语言环境有效,但UTF-8无效。

在我的代码方面,我已经解决了将输入解析为宽字符串并将其转换为UTF-8的问题,但我希望通过异常而不是崩溃来捕获这些类型的错误,难道PyUnicode_Check不会使用这些字符串失败吗?

当调用PyString_AsStringAndSize()时,Swig实际上在SWIG_AsCharPtrAndSize()中崩溃了,这是swig生成的代码:

代码语言:javascript
复制
    SWIGINTERN int
SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
{
#if PY_VERSION_HEX>=0x03000000
#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
  if (PyBytes_Check(obj))
#else
  if (PyUnicode_Check(obj))
#endif
#else  
  if (PyString_Check(obj))
#endif
  {
    char *cstr; Py_ssize_t len;
#if PY_VERSION_HEX>=0x03000000
#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
    if (!alloc && cptr) {
        /* We can't allow converting without allocation, since the internal
           representation of string in Python 3 is UCS-2/UCS-4 but we require
           a UTF-8 representation.
           TODO(bhy) More detailed explanation */
        return SWIG_RuntimeError;
    }
    obj = PyUnicode_AsUTF8String(obj);
    if(alloc) *alloc = SWIG_NEWOBJ;
#endif
    PyBytes_AsStringAndSize(obj, &cstr, &len);
#else
    PyString_AsStringAndSize(obj, &cstr, &len);
#endif
    if (cptr) {

碰巧崩溃到最后一个可见的PyString_AsStringAndSize。我注意到字符串是作为std::string传递的,但在中也使用const char*,没有任何区别。

谢谢你的建议!

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55630151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档