• 字符(字符数组)越界


    先上例子:

    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出现越界时,即使有时会正常输出(因为其后连续的地址空间为空,结束了操作),但已造成越界错误(若后续内存申请,其后地址被分配,地址空间内容不为空,造成越界访问)。

  • 相关阅读:
    我在2024年的第一个月
    软件1班20240607
    软考高级系统架构师_计算机组成与结构---备考笔记004
    答对这3个面试问题,薪资直涨20K
    码农必备?清华大学开源了一款写代码神器。。。
    Ansible概述以及模块
    【OceanBase诊断调优】—— obdiag 工具助力OceanBase数据库诊断调优(DBA 从入门到实践第八期)
    C++PrimerPlus 第六章 分支语句和逻辑运算符(编程练习含答案)
    webpack学习记录
    蓝桥杯备赛Day8——队列
  • 原文地址:https://blog.csdn.net/hao745580264_dawei/article/details/126581966