浏览代码

修复了str写入bug和写入字符串导致的内存越界

SongZihuan 5 年之前
父节点
当前提交
259a9b94a7
共有 2 个文件被更改,包括 9 次插入4 次删除
  1. 2 1
      paser/lex.h
  2. 7 3
      paser/lexical.c

+ 2 - 1
paser/lex.h

@@ -26,9 +26,10 @@
         paser->text = (char *)malloc(sizeof(char)); \
     } \
     else{ \
-        paser->text = (char *)realloc(paser->text, sizeof(char) * (len + 1)); \
+        paser->text = (char *)realloc(paser->text, sizeof(char) * (len + 2)); \
     } \
     paser->text[len] = p; \
+    paser->text[len + 1] = '\0'; \
     } while(0)
 
 #define CHECK_END(paser) \

+ 7 - 3
paser/lexical.c

@@ -307,12 +307,13 @@ void match_double(char p, word_paser *paser){  // 匹配一个double
                 paser->status = 1;
             }
             else{
-                paser->text = (char *)realloc(paser->text, sizeof(char) * (strlen(paser->text) + 1));
+                paser->text = (char *)realloc(paser->text, sizeof(char) * (len + 2));
                 if(p == '.'){
                     paser->status = 2; 
                 }
             }
             paser->text[len] = p;
+            paser->text[len + 1] = '\0';
         }
         else{
             if(paser->status == 2){  // 必须进入小数模式才可以
@@ -344,8 +345,9 @@ void match_str(char p, word_paser *paser){  // 匹配一个var字符串
         }
         else{
             if((p != '\'' && paser->status == 1) || (p != '\"' && paser->status == 2)){  // 匹配到最后一个
-                paser->text = (char *)realloc(paser->text, sizeof(char) * (len + 1));
+                paser->text = (char *)realloc(paser->text, sizeof(char) * (len + 2));
                 paser->text[len] = p;
+                paser->text[len + 1] = '\0';
             }
             else{
                 paser->status = WAIT_END;
@@ -362,6 +364,7 @@ void match_var(char p, word_paser *paser){  // 匹配一个var
             if(p == '_' || (p <= 'z' && p >= 'a')){
                 paser->text = (char *)malloc(sizeof(char));
                 paser->text[len] = p;
+                paser->text[len + 1] = '\0';
                 paser->status = 1;
             }
             else{
@@ -370,8 +373,9 @@ void match_var(char p, word_paser *paser){  // 匹配一个var
         }
         else{
             if(p == '_' || (p <= 'z' && p >= 'a') || (p <= '9' && p >= '0')){
-                paser->text = (char *)realloc(paser->text, sizeof(char) * (len + 1));
+                paser->text = (char *)realloc(paser->text, sizeof(char) * (len + 2));
                 paser->text[len] = p;
+                paser->text[len + 1] = '\0';
             }
             else{
                 paser->status = S_END;