欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其它g++版本号未知)

程序员文章站 2022-06-29 10:18:59
...

一、描写叙述

眼下已经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$)")