当前位置: 首页 > news >正文

【C++】std::wstring无法与-fshort-wchar同时使用

在进行Android跨平台开发时,意外发现std::wstring与-fshort-wchar参数存在冲突。会导致一系列内存越界读写,字符串溢出的情况。
经过调查。定位到std::wstring无法正确与-fshort-wchar参数共用。

在Windows平台的MSVC下,wchar_t默认是2字节,使用UTF-16LE编码。
在Linux,MacOS,Android平台下,wchar_t默认是4字节,使用UTF-32LE编码。如果在编译时,使用-fshort-wchar参数,会强制将wchar_t调整为2字节。

下面准备了一个简单的实验,同时使用了wchar_t和std::wstring两个类,存储一个‘中’字。

wchar_t wc = L'中';
printf("sizeof(wchar_t) = %lu\n", sizeof(wc));
printf("memory layout of wc: ");
for (int i = 0; i < sizeof(wc); i++)
{    printf("%02x ", ((unsigned char *)&wc)[i]);
}
printf("\n------\n");
std::wstring ws = L"中";
printf("ws.size() = %lu\n", ws.size());
printf("memory layout of ws: ");
for (int i = 0; i < ws.size() * sizeof(wchar_t); i++)
{printf("%02x ", ((unsigned char *)&ws[0])[i]);
}
printf("\n------");

代码编译

在MacOS平台使用不用的编译参数进行测试

不使用-fshort-wchar的参照组

g++ -std=c++11 -Wall wchar_size.cpp -o "build/wchar_default"

使用-fshort-wchar的实验组

g++ -std=c++11 -Wall -fshort-wchar wchar_size.cpp -o "build/wchar_short"

结果展示

参照组

sizeof(wchar_t) = 4
memory layout of wc: 2d 4e 00 00 
------
ws.size() = 1
memory layout of ws: 2d 4e 00 00 

-fshort-wchar实验组

sizeof(wchar_t) = 2
memory layout of wc: 2d 4e 
------
ws.size() = 8   <-------错误
memory layout of ws: 2d 4e 00 00 00 00 01 00 00 00 1c 00 00 00 03 00  <-------错误
------

实验总结

  • 在使用-fshort-wchar的实验组,可以正常识别wchar_t空间占用2字节
  • std::wstring无法正确适配-fshort-wchar参数。相关接口会发生混乱,无法正确处理字符串内容。
    • std::wstring对于宽字符占用字节数的处理,未受-fshort-wchar参数的影响。
    • std::wstring的部分逻辑已经编译到libc++的静态库和动态库中,并不会因为参数变更而进行适配。
http://www.jsqmd.com/news/491150/

相关文章:

  • 7个实用技巧!AISuite日志管理策略:构建企业级AI应用的可观测性体系
  • 如何用X-Spider高效下载Twitter历史媒体?日期范围筛选与重复文件跳过技巧
  • 终极指南:Semantic Kernel提示模板语言——LLM应用开发的核心引擎
  • 如何快速掌握TypeScript类型挑战:从Hello World开始的完整指南
  • 大润发购物卡回收指南:最快速变现的全流程解析 - 团团收购物卡回收
  • 如何快速掌握TypeScript数组第一个元素类型获取:Type Challenges实战指南
  • 2026厂房管道安装工程承包商推荐 ,靠谱口碑好的施工方甄选指南 - 品牌2026
  • 如何使用xManager实现多渠道打包:不同应用商店配置完全指南
  • 如何掌握TypeScript数字范围类型?Type-Challenges中的终极实现指南
  • 揭秘libSQL区块链:不可变数据存储的7大创新应用场景
  • 如何轻松掌握TypeScript元组长度推导:Type Challenges实战指南
  • 合金分析仪(XRF分析仪)怎么选?10 大主流企业盘点,聚焦日立分析仪器的全球技术与本土服务 - 品牌推荐大师1
  • 如何快速搭建高效用户反馈系统:xManager集成GitHub Issues全指南
  • 如何快速集成libSQL到iOS和Android:移动端数据库解决方案完整指南
  • 2026最新!10个降AIGC平台深度测评:全行业通用降AI率神器推荐
  • 电子半导体厂房恒温恒湿工程怎么做?揭秘高精度环境控制施工关键点与承包商选择指南 - 品牌2026
  • 如何掌握Type-Challenges中的Omit类型工具:从零开始的TypeScript进阶指南
  • 如何构建弹性伸缩的React应用:bulletproof-react自动扩缩容与资源优化指南
  • 如何利用Langchain-Chatchat 0.3版本的Rerank功能提升知识库问答精准度
  • 如何使用libSQL实现高效全文搜索:从索引创建到相关性排序的完整指南
  • sebastian/code-unit与Composer集成:简单几步完成安装配置
  • 实测才敢推!学生热捧的降AI率网站 —— 千笔
  • 揭秘React Scan的高效架构:多个子包如何协同实现React性能检测
  • 如何快速检测APK加密保护机制:Bytecode-Viewer安全分析指南
  • 如何使用 .NET Runtime 实现高性能网络编程:HttpClient与Quic协议完全指南
  • 如何掌握Type-Challenges中的Pick类型工具:从基础到实战的完整指南
  • B树 vs 红黑树:gh_mirrors/btr/btree适用场景深度探讨
  • 揭秘bypy:百度云Python客户端背后的开发故事与核心团队经验分享
  • 如何使用Invidious音频模式:开启背景播放与纯音频流提取的完整指南
  • DC-TTS训练全攻略:Text2Mel与SSRN双网络分离训练技巧