strcat 小bug引起的大问题


在调试STM32时,单步打断点运行时,没有问题,但是全速运行时,偶尔会跳过错误,偶尔也会跳转hardfault;

问题实在难找。。。

最后定位在发送数据的缓存上, 发现发送缓存部分除了应该有的数据之外, 还有好多不 为0的值;

也就是说,在栈上申请的内存,没有经过初始化,就使用strcat来追加字符串了;

详细查了一下strcat的用法,发现strcat需要先找到dest的结尾,才能够继续追加;

如果申请的内存没有初始化, 可能就会导致追加的字符串的位置不正确;从而可能导致了内存溢出(覆盖);

所以 程序就崩了。。。


贴上glibc的strcat的源码

char *
strcat (dest, src)
     char *dest;
     const char *src;
{
  char *s1 = dest;
  const char *s2 = src;
  reg_char c;
 
  /* Find the end of the string.  */
  do
    c = *s1++;
  while (c != '\0');

 
  /* Make S1 point before the next character, so we can increment
     it while memory is read (wins on pipelined cpus).  */
  s1 -= 2;
 
  do
    {
      c = *s2++;
      *++s1 = c;
    }
  while (c != '\0');
 
  return dest;
}


### 解决 Keil 编译器中关于 `strlen` 函数隐式声明的警告问题 在 C 语言编程中,当编译器遇到未显式声明的标准库函数时,会发出类似的警告。这种现象通常是因为缺少必要的头文件包含或者不正确的项目配置引起的。 #### 原因分析 该问题的根本原因是程序中调用了标准库函数 `strlen`,但在源文件中并未正确引入 `<string.h>` 头文件[^1]。由于编译器无法找到此函数的具体定义,因此默认将其视为返回整型值的函数,从而引发兼容性和潜在错误的风险。 #### 解决方案 为了消除此类警告并确保代码的安全性与可移植性,需采取以下措施: 1. **确保包含正确的头文件** 在使用任何标准库函数之前,务必通过 `#include` 指令导入对应的头文件。对于字符串操作类函数(如 `strlen`, `strcpy`, 或者 `strcat`),应始终包含 `<string.h>` 文件。 修改后的代码如下所示: ```c #include <string.h> // 添加这一行以支持 strlen 和其他字符串处理功能 void example_function() { char str[] = "example"; size_t length = strlen(str); // 使用 strlen 计算字符串长度 } ``` 2. **检查项目的预处理器设置** 如果确认已包含了适当头文件但仍存在相同警告,则可能是工程环境中的某些选项干扰了正常行为。例如,在 Keil uVision 中可能需要调整目标设备的支持库版本或启用 ANSI 标准模式来匹配所使用的 API 定义。 3. **验证工具链状态** 更新至最新版 MDK 软件包有助于修复旧版本中存在的 bug 并获得改进过的诊断信息反馈机制。此外,重新安装缺失组件也可能帮助恢复丢失的功能描述符链接关系。 ```c #include <stdio.h> #include <string.h> int main(){ const char *message="Hello, world!"; printf("Message is %d characters long.\n", (int)strlen(message)); } ``` 以上示例展示了如何正确运用 `strlen()` 来测量固定文本串的实际小,并打印结果到控制台窗口上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值