// 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
#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
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
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
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
}\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
{\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
{\r
case 9:\r
strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], " ");\r
- i += strlen(" ");\r
+ i += 6;\r
break;\r
\r
case '<':\r
strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "<");\r
- i += strlen("<");\r
+ i += 4;\r
break;\r
\r
case '>':\r
strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], ">");\r
- i += strlen(">");\r
+ i += 4;\r
break;\r
#if 0\r
case '&':\r
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
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
// 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
}\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