• 字符(字符数组)越界


    先上例子:

    1. char buffer1[32];
    2. memset(buffer1,'\061',sizeof(buffer1));
    3. buffer1[31] = '\0';
    4. printf("buffer1=%s\n", buffer1);
    5. char *buffer3 = "0123456789\0abcdef";//17
    6. strcpy(buffer1,buffer3);
    7. printf("buffer1=%s\n", buffer1);
    8. printf("buffer1=%s, len_buffer1=%d, buffer1[10]=%c, buffer1[11]=%c\n", buffer1, strlen(buffer1), buffer1[10], buffer1[11]);
    9. char buffer4[32];
    10. memset(buffer4,'\061',sizeof(buffer4));
    11. //buffer4[31] = '\0';
    12. printf("buffer4=%s, sizeof(buffer4)=%d\n", buffer4, sizeof(buffer4));
    13. char *buffer2 = "0123456789012345678901234567890123456789abc";//43
    14. memset(buffer4,0,sizeof(buffer4));
    15. strncpy(buffer4,buffer2,sizeof(buffer4));
    16. //buffer4[31] = '\0';
    17. printf("buffer4=%s, len_buffer4=%d, buffer4[10]=%c, buffer4[31]=%c\n", buffer4, strlen(buffer4), buffer4[10], buffer4[31]);

    1. //例2
    2. char start_ip[32];
    3. char *nvram_value = NULL;
    4. nvram_value = (char *)nvram_bufget(RT2860_NVRAM, "dhcpStart");
    5. memset(start_ip, 0x00, sizeof(start_ip));//将内存置为空0x00(地址格式)
    6. strncpy(start_ip, nvram_value, sizeof(start_ip));//n为目的地址大小
    7. start_ip[UDHCPD_CONF_BUFF-1] = '\0';//将最后一位置为结束符\0

    总结:

            1)start_ip[UDHCPD_CONF_BUFF-1] = '\0';
            当sizeof(nvram_value) >= sizeof(start_ip)时为满复制,结尾无结束符\0很危险(fgets读取一行时,没有结束符会将其他字符一并读取等);所以要将空间最后一位其赋值为结束符
            当sizeof(nvram_value) < sizeof(start_ip)时,dst没有占满,strncpy结束后会将剩下字符位置全部置为结束符\0
            ['1','2','3','4','\0','\0','\0','\0']
            2)一般字符串操作(包含打印字符串printf)等,都是遇到\0作为其结束操作的标志;

    拓展:

            snprintf函数有越界保护;sprintf没有越界保护;
            1)snprintf如果格式化后的字符串长度小于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0;
            2)snprintf如果格式化后的字符串长度大于等于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,返回值为欲写入的字符串长度。
            sprintf出现越界时,即使有时会正常输出(因为其后连续的地址空间为空,结束了操作),但已造成越界错误(若后续内存申请,其后地址被分配,地址空间内容不为空,造成越界访问)。

  • 相关阅读:
    如何提高redux开发效率?当然是redux-tookit啦!
    windows electron sources build,源码编译记录
    2023年中国肠胃炎用药行业现状分析:随着老龄化进程明显加速,市场规模同比增长7%[图]
    SelfKG代码阅读及相关工作
    verilog语言中条件编译ifdef的使用和例子
    越权漏洞详解
    【MATLAB源码-第157期】基于matlab的海马优化算法(SHO)机器人栅格路径规划,输出做短路径图和适应度曲线。
    怎么设置代理IP进行网络爬取呢?代理访问网络如何设置?
    【Linux】基础IO
    levelDB引擎
  • 原文地址:https://blog.csdn.net/hao745580264_dawei/article/details/126581966