Check potential non-existent global variables found in the DWARF information
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DWARFManager.cpp
index 1ee459f..df4f671 100644 (file)
@@ -10,6 +10,7 @@
 // JPM  12/03/2016  Created this file\r
 // JPM  12/03/2016  DWARF format support\r
 // JPM  Sept./2018  Added LEB128 decoding features, and improve the DWARF parsing information\r
+// JPM   Oct./2018  Improve the DWARF parsing information\r
 //\r
 \r
 // To Do\r
@@ -26,9 +27,9 @@
 #include "LEB128.h"\r
 \r
 \r
-//\r
+// Debug definitions\r
 //#define DEBUG_NumCU                  0x9                                     // CU number to debug or undefine it\r
-//#define DEBUG_VariableName   "alloc"                         // Variable name to look for or undefine it\r
+//#define DEBUG_VariableName   "sound_death"                           // Variable name to look for or undefine it\r
 //#define DEBUG_TypeName               "Cbuf_Execute"                  // Type name to look for or undefine it\r
 //#define DEBUG_TypeDef                        DW_TAG_typedef          // Type def to look for or undefine it (not supported)\r
 //#define DEBUG_Filename               "cmd.c"                 // Filename to look for or undefine it\r
@@ -281,7 +282,6 @@ void DWARFManager_InitDMI(void)
        Dwarf_Off return_offset;\r
        Dwarf_Line *linebuf;\r
        FILE *SrcFile;\r
-       size_t i, j, k;\r
        char *return_string;\r
        char *Ptr, *Ptr1;\r
 \r
@@ -557,7 +557,22 @@ void DWARFManager_InitDMI(void)
                                                                                        dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
                                                                                }\r
 \r
-                                                                               PtrCU[NbCU].NbVariables++;\r
+                                                                               // Check variable's name validity\r
+                                                                               if (PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName)\r
+                                                                               {\r
+                                                                                       // Check variable's memory address validity\r
+                                                                                       if (PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr)\r
+                                                                                       {\r
+                                                                                               // Valid variable\r
+                                                                                               PtrCU[NbCU].NbVariables++;\r
+                                                                                       }\r
+                                                                                       else\r
+                                                                                       {\r
+                                                                                               // Invalid variable\r
+                                                                                               free(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName);\r
+                                                                                               PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = NULL;\r
+                                                                                       }\r
+                                                                               }\r
 \r
                                                                                dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
                                                                        }\r
@@ -746,7 +761,7 @@ void DWARFManager_InitDMI(void)
                                                                                dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
 \r
                                                                                // Get source line number and associated block of address\r
-                                                                               for (i = 0; i < (size_t)cnt; ++i)\r
+                                                                               for (Dwarf_Signed i = 0; i < cnt; ++i)\r
                                                                                {\r
                                                                                        if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)\r
                                                                                        {\r
@@ -888,7 +903,7 @@ void DWARFManager_InitDMI(void)
                                        }\r
 \r
                                        // Release the memory used by the source lines\r
-                                       for (i = 0; i < (size_t)cnt; ++i)\r
+                                       for (Dwarf_Signed i = 0; i < cnt; ++i)\r
                                        {\r
                                                dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);\r
                                        }\r
@@ -900,13 +915,13 @@ void DWARFManager_InitDMI(void)
                                {\r
                                        if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(PtrCU[NbCU].NbLinesLoadSrc, sizeof(char *)))\r
                                        {\r
-                                               for (j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++)\r
+                                               for (size_t j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++)\r
                                                {\r
                                                        if (PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)calloc(10000, sizeof(char)))\r
                                                        {\r
                                                                if (Ptr = DWARFManager_GetLineSrcFromNumLine(PtrCU[NbCU].PtrLoadSrc, (j + 1)))\r
                                                                {\r
-                                                                       i = 0;\r
+                                                                       size_t i = 0;\r
 \r
                                                                        while (*Ptr)\r
                                                                        {\r
@@ -914,17 +929,17 @@ void DWARFManager_InitDMI(void)
                                                                                {\r
                                                                                case 9:\r
                                                                                        strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&nbsp;");\r
-                                                                                       i += strlen("&nbsp;");\r
+                                                                                       i += 6;\r
                                                                                        break;\r
 \r
                                                                                case '<':\r
                                                                                        strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&lt;");\r
-                                                                                       i += strlen("&lt;");\r
+                                                                                       i += 4;\r
                                                                                        break;\r
 \r
                                                                                case '>':\r
                                                                                        strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&gt;");\r
-                                                                                       i += strlen("&gt;");\r
+                                                                                       i += 4;\r
                                                                                        break;\r
 #if 0\r
                                                                                case '&':\r
@@ -945,12 +960,12 @@ void DWARFManager_InitDMI(void)
                                                                                Ptr++;\r
                                                                        }\r
                                                                }\r
-                                                               PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], i + 1);\r
+                                                               PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], strlen(PtrCU[NbCU].PtrLinesLoadSrc[j]) + 1);\r
                                                        }\r
                                                }\r
 \r
                                                // Init lines source information based on each source code line numbers\r
-                                               for (j = 0; j < PtrCU[NbCU].NbSubProgs; j++)\r
+                                               for (size_t j = 0; j < PtrCU[NbCU].NbSubProgs; j++)\r
                                                {\r
                                                        // Check if the subprog / function's line exists in the source code\r
                                                        if (PtrCU[NbCU].PtrSubProgs[j].NumLineSrc <= PtrCU[NbCU].NbLinesLoadSrc)\r
@@ -958,7 +973,7 @@ void DWARFManager_InitDMI(void)
                                                                PtrCU[NbCU].PtrSubProgs[j].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].NumLineSrc - 1];\r
                                                        }\r
 \r
-                                                       for (k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++)\r
+                                                       for (size_t k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++)\r
                                                        {\r
                                                                if (PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc <= PtrCU[NbCU].NbLinesLoadSrc)\r
                                                                {\r
@@ -976,10 +991,10 @@ void DWARFManager_InitDMI(void)
                                                // Check the presence of source lines dedicated to the sub progs\r
                                                if (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc)\r
                                                {\r
-                                                       i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc;\r
+                                                       size_t i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc;\r
                                                        if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(i, sizeof(char *)))\r
                                                        {\r
-                                                               for (j = 0; j < i; j++)\r
+                                                               for (size_t j = 0; j < i; j++)\r
                                                                {\r
                                                                        PtrCU[NbCU].PtrLinesLoadSrc[j] = NULL;\r
                                                                }\r
@@ -989,15 +1004,15 @@ void DWARFManager_InitDMI(void)
                                }\r
 \r
                                // Init global variables information based on types information\r
-                               for (i = 0; i < PtrCU[NbCU].NbVariables; i++)\r
+                               for (size_t i = 0; i < PtrCU[NbCU].NbVariables; i++)\r
                                {\r
                                        DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrVariables + i);\r
                                }\r
 \r
                                // Init local variables information based on types information\r
-                               for (i = 0; i < PtrCU[NbCU].NbSubProgs; i++)\r
+                               for (size_t i = 0; i < PtrCU[NbCU].NbSubProgs; i++)\r
                                {\r
-                                       for (j = 0; j < PtrCU[NbCU].PtrSubProgs[i].NbVariables; j++)\r
+                                       for (size_t j = 0; j < PtrCU[NbCU].PtrSubProgs[i].NbVariables; j++)\r
                                        {\r
                                                DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrSubProgs[i].PtrVariables + j);\r
                                        }\r