diff --git a/CMakeLists.txt b/CMakeLists.txt index e0d1265..52fd3b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,9 +36,11 @@ target_compile_definitions(akerror add_executable(test_err_catch tests/err_catch.c) add_executable(test_err_cleanup tests/err_cleanup.c) add_executable(test_err_trace tests/err_trace.c) +add_executable(test_err_unhandled tests/err_unhandled.c) add_test(NAME err_catch COMMAND test_err_catch) add_test(NAME err_cleanup COMMAND test_err_cleanup) add_test(NAME err_trace COMMAND test_err_trace) +add_test(NAME err_unhandled COMMAND test_err_unhandled) # Specify include directories for the library's headers (if applicable) target_include_directories(akerror PUBLIC @@ -48,6 +50,7 @@ target_include_directories(akerror PUBLIC target_link_libraries(test_err_catch PRIVATE akerror) target_link_libraries(test_err_cleanup PRIVATE akerror) target_link_libraries(test_err_trace PRIVATE akerror) +target_link_libraries(test_err_unhandled PRIVATE akerror) set(main_lib_dest "lib/my_library-${MY_LIBRARY_VERSION}") install(TARGETS akerror EXPORT akerror DESTINATION "lib/") diff --git a/include/akerror.tmpl.h b/include/akerror.tmpl.h index 8c69f09..94441a5 100644 --- a/include/akerror.tmpl.h +++ b/include/akerror.tmpl.h @@ -55,6 +55,7 @@ typedef struct bool reported; char stacktracebuf[AKERR_MAX_ERROR_STACKTRACE_BUF_LENGTH]; char *stacktracebufptr; + int stacktracebufremaining; } akerr_ErrorContext; #define AKERR_NOIGNORE __attribute__((warn_unused_result)) @@ -67,6 +68,7 @@ extern akerr_ErrorUnhandledErrorHandler akerr_handler_unhandled_error; extern akerr_ErrorLogFunction akerr_log_method; extern akerr_ErrorContext *__akerr_last_ignored; +akerr_ErrorContext AKERR_NOIGNORE *akerr_user_main(int argc, char **argv); akerr_ErrorContext AKERR_NOIGNORE *akerr_release_error(akerr_ErrorContext *ptr); akerr_ErrorContext AKERR_NOIGNORE *akerr_next_error(); char *akerr_name_for_status(int status, char *name); diff --git a/src/error.c b/src/error.c index f68f10a..c60f37f 100644 --- a/src/error.c +++ b/src/error.c @@ -14,6 +14,28 @@ char __AKERR_ERROR_NAMES[AKERR_MAX_ERR_VALUE+1][AKERR_MAX_ERROR_NAME_LENGTH]; akerr_ErrorContext AKERR_ARRAY_ERROR[AKERR_MAX_ARRAY_ERROR]; +int main(int argc, char **argv) +{ + int i = 0; + PREPARE_ERROR(e); + ATTEMPT { + CATCH(e, akerr_user_main(argc, argv)); + if ( e == NULL || e->status == 0 ) { + /* User code claims everything went fine, doublecheck the error array before we quit */ + for ( i = AKERR_MAX_ARRAY_ERROR - 1; i >= 0; i-- ) { + if ( AKERR_ARRAY_ERROR[i].status != 0 && AKERR_ARRAY_ERROR[i].refcount != 0 ) { + akerr_log_method("%s:%s:%d: Found unhandled and unreported error in the array at index %d\n", __FILE__, (char *)__func__, __LINE__, i); + e = &AKERR_ARRAY_ERROR[i]; + } + } + } + } CLEANUP { + } PROCESS(e) { + } FINISH_NORETURN(e); + SUCCEED(e); + return 0; +} + void akerr_default_logger(const char *fmt, ...) { #if defined(AKERR_USE_STDLIB) && AKERR_USE_STDLIB == 1 diff --git a/tests/err_catch.c b/tests/err_catch.c index 2d21b5c..bb836d8 100644 --- a/tests/err_catch.c +++ b/tests/err_catch.c @@ -23,7 +23,7 @@ akerr_ErrorContext *func1(void) } -int main(void) +akerr_ErrorContext *akerr_user_main(int argc, char **argv) { PREPARE_ERROR(errctx); ATTEMPT { @@ -32,5 +32,6 @@ int main(void) } PROCESS(errctx) { } HANDLE(errctx, AKERR_NULLPOINTER) { akerr_log_method("Caught exception"); - } FINISH_NORETURN(errctx); + } FINISH(errctx, true); + SUCCEED(errctx); } diff --git a/tests/err_cleanup.c b/tests/err_cleanup.c index 0018c25..4ab93ad 100644 --- a/tests/err_cleanup.c +++ b/tests/err_cleanup.c @@ -25,7 +25,7 @@ akerr_ErrorContext *func1(void) SUCCEED_RETURN(errctx); } -int main(void) +akerr_ErrorContext *akerr_user_main(int argc, char **argv) { x = 12345; PREPARE_ERROR(errctx); @@ -35,9 +35,8 @@ int main(void) } PROCESS(errctx) { } HANDLE(errctx, AKERR_NULLPOINTER) { if ( x == 0 ) { - fprintf(stderr, "Cleanup works\n"); - return 0; + FAIL_RETURN(errctx, AKERR_API, "Cleanup does not work"); } - return 1; - } FINISH_NORETURN(errctx); + } FINISH(errctx, true); + SUCCEED(errctx); } diff --git a/tests/err_trace.c b/tests/err_trace.c index 11f87bd..2ed23e1 100644 --- a/tests/err_trace.c +++ b/tests/err_trace.c @@ -23,12 +23,13 @@ akerr_ErrorContext *func1(void) } -int main(void) +akerr_ErrorContext *akerr_user_main(int argc, char **argv) { PREPARE_ERROR(errctx); ATTEMPT { CATCH(errctx, func1()); } CLEANUP { } PROCESS(errctx) { - } FINISH_NORETURN(errctx); + } FINISH(errctx, true); + SUCCEED(errctx); }