diff --git a/include/link/patch.hpp b/include/link/patch.hpp index 666c7b9f..3e6ce96d 100644 --- a/include/link/patch.hpp +++ b/include/link/patch.hpp @@ -14,7 +14,7 @@ struct Assertion { struct Patch patch; // Also used for its `.type` - std::string *message; + std::string message; // This would be redundant with `.section->fileSymbols`... but `section` is sometimes NULL! std::vector *fileSymbols; }; diff --git a/src/link/object.cpp b/src/link/object.cpp index 5554ff57..f1fd1c4f 100644 --- a/src/link/object.cpp +++ b/src/link/object.cpp @@ -384,11 +384,14 @@ static void readAssertion(FILE *file, struct Assertion *assert, char const *file std::vector const &fileNodes) { char assertName[sizeof("Assertion #4294967295")]; // UINT32_MAX + std::string *name; snprintf(assertName, sizeof(assertName), "Assertion #%" PRIu32, i); readPatch(file, &assert->patch, fileName, assertName, 0, fileNodes); - tryReadstring(assert->message, file, "%s: Cannot read assertion's message: %s", fileName); + tryReadstring(name, file, "%s: Cannot read assertion's message: %s", fileName); + assert->message = *name; + delete name; } static struct Section *getMainSection(struct Section *section) @@ -587,7 +590,4 @@ void obj_Cleanup(void) sect_ForEach(freeSection); sect_CleanupSections(); - - for (struct Assertion &assert : assertions) - delete assert.message; } diff --git a/src/link/patch.cpp b/src/link/patch.cpp index 1440edf1..0ba328c5 100644 --- a/src/link/patch.cpp +++ b/src/link/patch.cpp @@ -422,24 +422,23 @@ void patch_CheckAssertions(std::deque &assertions) switch (type) { case ASSERT_FATAL: fatal(assert.patch.src, assert.patch.lineNo, "%s", - !assert.message->empty() ? assert.message->c_str() - : "assert failure"); + !assert.message.empty() ? assert.message.c_str() + : "assert failure"); case ASSERT_ERROR: error(assert.patch.src, assert.patch.lineNo, "%s", - !assert.message->empty() ? assert.message->c_str() - : "assert failure"); + !assert.message.empty() ? assert.message.c_str() + : "assert failure"); break; case ASSERT_WARN: warning(assert.patch.src, assert.patch.lineNo, "%s", - !assert.message->empty() ? assert.message->c_str() - : "assert failure"); + !assert.message.empty() ? assert.message.c_str() + : "assert failure"); break; } } else if (isError && type == ASSERT_FATAL) { fatal(assert.patch.src, assert.patch.lineNo, "Failed to evaluate assertion%s%s", - !assert.message->empty() ? ": " : "", - assert.message->c_str()); + !assert.message.empty() ? ": " : "", assert.message.c_str()); } } }