一、描写叙述
眼下已经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$)")