您的位置:首页 > 运维架构 > Linux

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$)")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bug 64位 段错误
相关文章推荐