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


    一、描写叙述

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




  • 相关阅读:
    Codeforces Global Round 11
    2018-2019 ICPC, Asia Najing
    Codeforces Round #675 (Div. 2) ABCDE
    AtCoder Regular Contest 104 D(卡常)
    Navigator History Location
    键盘移动div
    键盘事件
    事件的传播
    事件的绑定
    事件的委派
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5200409.html
Copyright © 2020-2023  润新知