微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wcsrtombs_s 中可能存在的错误

如何解决wcsrtombs_s 中可能存在的错误

我是否在 wcsrtombs_s 中发现了无法返回给调用者的错误_TruncATE 宏作为 count 参数提供时,应该在目标字符串的大小已知(数组引用)时防止缓冲区溢出,同时用尽可能多的参数填充 mbstr 参数字符,因为它可以容纳包括空终止符。我已将其定位到 VS 2017 中的 64 位版本。请注意,vcruntime.hsize_t 定义为 64 位无符号整数而不是 32 位无符号整数(可能是一个线索?)。作为一个实验,我分别明确地替换了 UINT32_MAXUINT64_MAX,结果没有变化(回想一下,这些都是像 -1 和 _TruncATE 一样的所有位设置,但它们不同每个尺寸)。根据 Microsoft 文档(找到 here )有问题的重载如下:

template <size_t size>
errno_t wcsrtombs_s(
   size_t *pReturnValue,char (&mbstr)[size],const wchar_t **wcstr,sizeof count,mbstate_t *mbstate
); // C++ only

我对 wcsrtombs_s 的第二次调用预期返回值 STruncATE,但不幸的是从未达到过这样的程度:

    const wchar_t wcstr[32] = L"abcdefghijklmnopqrstuvwxyz";
    char mbstr[16] = { 0 };
    size_t ret_val = 0;
    mbstate_t mbstate = { 0 };
    wchar_t *pws = wcstr;
    // this code returns to the caller
    errno_t ret_code = wcsrtombs_s(&ret_val,mbstr,&pws,15,&mbstate);

    *mbstr = 0;
    mbstate = { 0 };
    ret_val = 0;

    // this code fails to return to the caller!
    ret_code = wcsrtombs_s(&ret_val,_TruncATE,&mbstate);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。