记最近遇到的2次数组溢出问题

一、

char dbg_info[1024];
for(uint8_t i=0; i<Uart2Para.Rxcnt; ++i)
				    sprintf(dbg_info+3*i, "%02X ", Rx2_buf[i]);

开始设置的dbg_info数组长度是512,程序中Uart2Para.Rxcnt有次达到193,此时dbg_info数组访问越界,造成程序运行异常

二、

uint8_t lx12864_string[17];
sprintf((char *)lx12864_string, "%4d-%02d-%02d %02d:%02d", calendar.w_year, calendar.w_month, calendar.w_date, calendar.hour, calendar.min);
		  LxShow(4, lx12864_string);

开始定义的lx12864_string数组长度为16,sprintf后字符串尾会自动添加0,导致地址lx12864_string+17处赋值0,长度为16就会覆盖其他变量值,覆盖的什么变量可以在.map文件查看

本例中 .map 文件部分如下:

g_Battery_Capacity                       0x2000065c   Data           4  packet.o(.data)
    g_Total_Working_Time                     0x20000660   Data           4  packet.o(.data)
    g_Working_time                           0x20000664   Data           4  packet.o(.data)
    uwTickFreq                               0x20000668   Data           1  stm32f1xx_hal.o(.data)
    uwTickPrio                               0x2000066c   Data           4  stm32f1xx_hal.o(.data)
    uwTick                                   0x20000670   Data           4  stm32f1xx_hal.o(.data)
    SystemCoreClock                          0x20000674   Data           4  system_stm32f1xx.o(.data)
    user_data                                0x2000067c   Data         256  main.o(.bss)
    hadc1                                    0x2000077c   Data          48  adc.o(.bss)
    calendar                                 0x200007ac   Data          16  rtc.o(.bss)
    datestring                               0x200007bc   Data          50  rtc.o(.bss)
    timestring                               0x200007ee   Data          50  rtc.o(.bss)
    weekstring                               0x20000820   Data          50  rtc.o(.bss)
    hrtc                                     0x20000854   Data          20  rtc.o(.bss)
    htim3                                    0x20000868   Data          72  tim.o(.bss)
    htim6                                    0x200008b0   Data          72  tim.o(.bss)
    Rx1_buf                                  0x200008f8   Data         256  usart.o(.bss)
    Uart1Para                                0x200009f8   Data          12  usart.o(.bss)
    Rx2_buf                                  0x20000a04   Data        1280  usart.o(.bss)
    Uart2Para                                0x20000f04   Data          12  usart.o(.bss)
    huart1                                   0x20000f10   Data          68  usart.o(.bss)
    huart2                                   0x20000f54   Data          68  usart.o(.bss)
    data_buf                                 0x20000f98   Data         256  scl3300.o(.bss)
    SCL3300_D01_Handle                       0x20001098   Data          35  scl3300.o(.bss)
    lx12864_string                           0x2000113b   Data          17  lx12864.o(.bss)
    cfg_info                                 0x2000114c   Data        1329  config.o(.bss)
    ServerIP                                 0x2000167d   Data          16  config.o(.bss)
    storage_item                             0x2000168d   Data          32  mysql.o(.bss)
    packet_head                              0x200016ad   Data          23  packet.o(.bss)
    heartbeat_packet                         0x200016c4   Data          12  packet.o(.bss)
    basicinfo_packet                         0x200016d0   Data         176  packet.o(.bss)
    workingstate_packet                      0x20001780   Data          64  packet.o(.bss)
    probleminfo_packet                       0x200017c0   Data          29  packet.o(.bss)
    polelean_packet                          0x200017dd   Data          59  packet.o(.bss)
    svrack_packet                            0x20001818   Data          12  packet.o(.bss)
    dbg_info                                 0x20001824   Data        1024  packet.o(.bss)
    pFlash                                   0x20002428   Data          32  stm32f1xx_hal_flash.o(.bss)
    __initial_sp                             0x20004448   Data           0  startup_stm32f103xe.o(STACK)

lx12864_string后面是cfg_info,所以lx12864_string越界后覆盖了cfg_info的值,实际程序运行也是如此,cfg_info的首字节被赋0

lx12864_string要定义17字节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值