Fix memory leaks in hdoc.

This commit is contained in:
Jordan Bancino 2023-05-15 22:38:52 +00:00
parent ef8c2f0865
commit 767c8728f7
5 changed files with 29 additions and 11 deletions

View File

@ -417,6 +417,7 @@ HeaderParse(Stream * stream, HeaderExpr * expr)
StrEquals(word, "endif")) StrEquals(word, "endif"))
{ {
/* Read no more words, that's the whole directive */ /* Read no more words, that's the whole directive */
Free(word);
} }
else else
{ {

View File

@ -154,7 +154,7 @@ finish:
StreamClose(StreamStdin()); StreamClose(StreamStdin());
StreamClose(StreamStderr()); StreamClose(StreamStderr());
GenerateMemoryReport(argv[0]); GenerateMemoryReport(argc, argv);
MemoryFreeAll(); MemoryFreeAll();

View File

@ -62,7 +62,7 @@ MemoryIterator(MemoryInfo * i, void *args)
} }
void void
GenerateMemoryReport(const char *prog) GenerateMemoryReport(int argc, char **argv)
{ {
char reportName[128]; char reportName[128];
char *namePtr; char *namePtr;
@ -77,6 +77,7 @@ GenerateMemoryReport(const char *prog)
time_t currentTime; time_t currentTime;
struct tm *timeInfo; struct tm *timeInfo;
char tsBuffer[1024]; char tsBuffer[1024];
size_t i;
if (!MemoryAllocated()) if (!MemoryAllocated())
{ {
@ -86,7 +87,7 @@ GenerateMemoryReport(const char *prog)
return; return;
} }
snprintf(reportName, sizeof(reportName), "%s-leaked.txt", prog); snprintf(reportName, sizeof(reportName), "%s-leaked.txt", argv[0]);
/* Make sure the report goes in the current working directory. */ /* Make sure the report goes in the current working directory. */
namePtr = basename(reportName); namePtr = basename(reportName);
report = fopen(namePtr, "a"); report = fopen(namePtr, "a");
@ -100,8 +101,12 @@ GenerateMemoryReport(const char *prog)
strftime(tsBuffer, sizeof(tsBuffer), "%c", timeInfo); strftime(tsBuffer, sizeof(tsBuffer), "%c", timeInfo);
fprintf(report, "---------- Memory Report ----------\n"); fprintf(report, "---------- Memory Report ----------\n");
fprintf(report, "Program: %s\n", prog); fprintf(report, "Program:");
fprintf(report, "Date: %s\n", tsBuffer); for (i = 0; i < argc; i++)
{
fprintf(report, " '%s'", argv[i]);
}
fprintf(report, "\nDate: %s\n", tsBuffer);
fprintf(report, "Total Bytes: %lu\n", MemoryAllocated()); fprintf(report, "Total Bytes: %lu\n", MemoryAllocated());
fprintf(report, "\n"); fprintf(report, "\n");

View File

@ -41,13 +41,13 @@
/** /**
* Write a memory report to a file in the current directory, using * Write a memory report to a file in the current directory, using
* the provided string as the name of the program currently being * the provided program arguments, including the program name that
* executed. This function is to be called after all memory is * executed. This function is to be called after all memory is
* supposed to have been freed. It iterates over all remaining * supposed to have been freed. It iterates over all remaining
* memory and generates a text file containing all of the * memory and generates a text file containing all of the
* recorded information about each block, including a hex dump of * recorded information about each block, including a hex dump of
* the data stored in them. * the data stored in them.
*/ */
extern void GenerateMemoryReport(const char *); extern void GenerateMemoryReport(int argc, char **argv);
#endif /* CYTOPLASM_RUNTIME_H */ #endif /* CYTOPLASM_RUNTIME_H */

View File

@ -527,23 +527,35 @@ finish:
for (i = 0; i < ArraySize(declarations); i++) for (i = 0; i < ArraySize(declarations); i++)
{ {
Free(ArrayGet(declarations, i)); size_t j;
decl = ArrayGet(declarations, i);
for (j = 0; j < ArraySize(decl->decl.args); j++)
{
Free(ArrayGet(decl->decl.args, j));
} }
ArrayFree(decl->decl.args);
Free(decl);
}
ArrayFree(declarations);
for (i = 0; i < ArraySize(typedefs); i++) for (i = 0; i < ArraySize(typedefs); i++)
{ {
Free(ArrayGet(typedefs, i)); Free(ArrayGet(typedefs, i));
} }
ArrayFree(typedefs);
for (i = 0; i < ArraySize(globals); i++) for (i = 0; i < ArraySize(globals); i++)
{ {
Free(ArrayGet(globals, i)); Free(ArrayGet(globals, i));
} }
ArrayFree(globals);
for (i = 0; i < ArraySize(descr); i++) for (i = 0; i < ArraySize(descr); i++)
{ {
Free(ArrayGet(descr, i)); Free(ArrayGet(descr, i));
} }
ArrayFree(descr);
while (HashMapIterate(registers, &key, (void **) &val)) while (HashMapIterate(registers, &key, (void **) &val))
{ {