天天看點

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;

  do

    c = *s1++;

  while (c != '\0');

  s1 -= 2;

  do

    {

      c = *s2++;

      *++s1 = c;

    }

  while (c != '\0');

  return dest;

}