Fix handling of CATCH() or FAIL() macros around functions that should return an (akerr_ErrorContext *) but return an invalid pointer (to something not in our exception array)
This commit is contained in:
@@ -36,9 +36,11 @@ target_compile_definitions(akerror
|
|||||||
add_executable(test_err_catch tests/err_catch.c)
|
add_executable(test_err_catch tests/err_catch.c)
|
||||||
add_executable(test_err_cleanup tests/err_cleanup.c)
|
add_executable(test_err_cleanup tests/err_cleanup.c)
|
||||||
add_executable(test_err_trace tests/err_trace.c)
|
add_executable(test_err_trace tests/err_trace.c)
|
||||||
|
add_executable(test_err_improper_closure tests/err_improper_closure.c)
|
||||||
add_test(NAME err_catch COMMAND test_err_catch)
|
add_test(NAME err_catch COMMAND test_err_catch)
|
||||||
add_test(NAME err_cleanup COMMAND test_err_cleanup)
|
add_test(NAME err_cleanup COMMAND test_err_cleanup)
|
||||||
add_test(NAME err_trace COMMAND test_err_trace)
|
add_test(NAME err_trace COMMAND test_err_trace)
|
||||||
|
add_test(NAME err_improper_closure COMMAND test_err_improper_closure)
|
||||||
|
|
||||||
# Specify include directories for the library's headers (if applicable)
|
# Specify include directories for the library's headers (if applicable)
|
||||||
target_include_directories(akerror PUBLIC
|
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_catch PRIVATE akerror)
|
||||||
target_link_libraries(test_err_cleanup PRIVATE akerror)
|
target_link_libraries(test_err_cleanup PRIVATE akerror)
|
||||||
target_link_libraries(test_err_trace PRIVATE akerror)
|
target_link_libraries(test_err_trace PRIVATE akerror)
|
||||||
|
target_link_libraries(test_err_improper_closure PRIVATE akerror)
|
||||||
|
|
||||||
set(main_lib_dest "lib/my_library-${MY_LIBRARY_VERSION}")
|
set(main_lib_dest "lib/my_library-${MY_LIBRARY_VERSION}")
|
||||||
install(TARGETS akerror EXPORT akerror DESTINATION "lib/")
|
install(TARGETS akerror EXPORT akerror DESTINATION "lib/")
|
||||||
|
|||||||
@@ -14,6 +14,12 @@ char __AKERR_ERROR_NAMES[AKERR_MAX_ERR_VALUE+1][AKERR_MAX_ERROR_NAME_LENGTH];
|
|||||||
|
|
||||||
akerr_ErrorContext AKERR_ARRAY_ERROR[AKERR_MAX_ARRAY_ERROR];
|
akerr_ErrorContext AKERR_ARRAY_ERROR[AKERR_MAX_ARRAY_ERROR];
|
||||||
|
|
||||||
|
int akerr_valid_error_address(akerr_ErrorContext *ptr)
|
||||||
|
{
|
||||||
|
// Is this within the memory region occupied by AKERR_ARRAY_ERROR?
|
||||||
|
return ((ptr >= &AKERR_ARRAY_ERROR[0]) && (ptr <= &AKERR_ARRAY_ERROR[AKERR_MAX_ARRAY_ERROR-1]));
|
||||||
|
}
|
||||||
|
|
||||||
void akerr_default_logger(const char *fmt, ...)
|
void akerr_default_logger(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
#if defined(AKERR_USE_STDLIB) && AKERR_USE_STDLIB == 1
|
#if defined(AKERR_USE_STDLIB) && AKERR_USE_STDLIB == 1
|
||||||
|
|||||||
22
tests/err_improper_closure.c
Normal file
22
tests/err_improper_closure.c
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#include "akerror.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
akerr_ErrorContext AKERR_NOIGNORE *improper_closure(void)
|
||||||
|
{
|
||||||
|
PREPARE_ERROR(errctx);
|
||||||
|
ATTEMPT {
|
||||||
|
} CLEANUP {
|
||||||
|
} PROCESS(errctx) {
|
||||||
|
} FINISH(errctx, true);
|
||||||
|
fprintf(stderr, "Improperly returning from improper_closure\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
PREPARE_ERROR(errctx);
|
||||||
|
ATTEMPT {
|
||||||
|
CATCH(errctx, improper_closure());
|
||||||
|
} CLEANUP {
|
||||||
|
} PROCESS(errctx) {
|
||||||
|
} FINISH_NORETURN(errctx);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user