活动介绍

#define RX_BUF_MAX_LEN 1024 //最大字节数 extern struct STRUCT_USART_Fram //数据帧结构体 { char Data_RX_BUF[RX_BUF_MAX_LEN]; union { __IO u16 InfAll; struct { __IO u16 FramLength :15; // 14:0 __IO u16 FramFinishFlag :1; // 15 }InfBit; }; }ESP8266_Fram_Record_Struct; bool ESP8266_Send_AT_Cmd(char *cmd,char *ack1,char *ack2,u32 time) { ESP8266_Fram_Record_Struct .InfBit .FramLength = 0; //重新接收新的数据包 ESP8266_USART("%s\r\n", cmd); if(ack1==0&&ack2==0) //不需要接收数据 { return true; } delay_ms(time); //延时 delay_ms(1000); ESP8266_Fram_Record_Struct.Data_RX_BUF[ESP8266_Fram_Record_Struct.InfBit.FramLength ] = '\0'; printf("%s",ESP8266_Fram_Record_Struct .Data_RX_BUF); if(ack1!=0&&ack2!=0) { return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack1 ) || ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack2 ) ); } else if( ack1 != 0 ) //strstr(s1,s2);检测s2是否为s1的一部分,是返回该位置,否则返回false,它强制转换为bool类型了 return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack1 ) ); else return ( ( bool ) strstr ( ESP8266_Fram_Record_Struct .Data_RX_BUF, ack2 ) ); } 这里的数组溢出了怎么解决

时间: 2024-04-20 10:26:16 浏览: 252
在给定的代码中,存在数组溢出的潜在问题。在ESP8266_Send_AT_Cmd函数的最后,将ESP8266_Fram_Record_Struct.Data_RX_BUF的第ESP8266_Fram_Record_Struct.InfBit.FramLength个元素(即FramLength的值)设置为'\0'(空字符),但没有对FramLength进行边界检查,这可能导致数组溢出。 要解决这个问题,可以在设置空字符之前,添加对FramLength的边界检查。可以使用条件语句来确保FramLength不超过数组Data_RX_BUF的最大长度。以下是一个可能的修改: ```c if (ESP8266_Fram_Record_Struct.InfBit.FramLength < RX_BUF_MAX_LEN) { ESP8266_Fram_Record_Struct.Data_RX_BUF[ESP8266_Fram_Record_Struct.InfBit.FramLength] = '\0'; } else { // 处理溢出情况,例如打印错误信息或采取其他适当的操作 } ``` 通过这样的修改,当FramLength超过数组Data_RX_BUF的最大长度时,可以避免数组溢出问题。应根据具体需求选择适当的错误处理方式。
阅读全文

相关推荐