linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其他g++版本未知)
2014-11-18 16:03
344 查看
一、描述
目前已经linux64位系统中g++4.4.7下发现了该bug。其他的版本还未测试。经测试,如果传入wcsncpy函数第一个参数(即目标缓冲区)的地址不能被4整除的话就必定会发生段错误。
经调试,函数的汇编代码中有使用到movdqa指令,该指令要求参数必须内存对齐,如果参数(目标缓存区)不是内存对齐的,就会造成段错误.
二、测试代码
#include <wchar.h> #pragma pack(1) struct Kom { char c; wchar_t s[32]; }; #pragma pack() int main(int argc, char** argv) { Kom kom; const wchar_t* k = L"Kom"; wcsncpy(kom.s, k, sizeof(kom.s) / sizeof(kom.s[0])); return 0; }
三、解决方案
既然不能用wcsncpy,那么我们可以用swprintf来代替。当然一条脚本就能搞定:sed -i -r "s/wcsncpy\((.*?),(.*?),(.*?)\);/swprintf(\1, \3, L\"%ls\", \2);/g" $(find . -regextype "egrep" -regex ".*(\.h$|\.cpp$)")
相关文章推荐
- linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其它g++版本号未知)
- 使用svn trac mod_wsgi httpd组建版本控制和bug跟踪系统
- 查看cpu 以及linux和windows系统是32为还是64位?+查看操作系统版本
- Linux 64位系统下inet_ntoa报段错误问题
- VS2010 64位系统 连接数据库时报“连接数据库 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的错误 解决方法
- 解决64位Linux系统编译32位错误
- 查看linux系统版本是32位的还是64位的
- 查看linux系统版本是32位还是64位
- CentOS v6.4 64位系统编译linux3.0.8内核错误的解决
- linux redhat 5.6 下安装oracle 10g时系统版本错误
- linux通过GRUP引导多操作系统时USB键盘不可使用,导致无数选择其他系统
- 查看自己linux版本使用的文件系统格式
- Linux 下使用 NMON 分析系统性能(其他如dstat、iostat)
- 查看linux系统版本是32位的还是64位的
- cvsnt2.5 版本与cvstracnt 配合使用方法 - CVSTrac 错误跟踪系统 - CnPack Forum - Powered by Discuz!
- 64位Linux使用yum安装两个相同软件不同版本包的解决方法
- Linux系统平台下关于GCC编译及使用的方法 (-Werror,它要求GCC将所有的警告当成错误进行处理
- 使用fsck命令修复linux文件系统错误【避开引起系统崩溃,启动不了的"-a"选项】
- linux 系统使用/管理之-----64位装ubuntu win7双系统
- Boost在linux和其他系统上的使用