Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 19 additions & 15 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ project(c_traceback
DESCRIPTION "Colorful, lightweight tracebacks in C"
)

# --- Dependencies & Modules ---
### Dependencies & Modules ###
include(GNUInstallDirs)

# --- Options ---
### Options ###
option(ENABLE_SANITIZERS "Enable address and undefined sanitizers" OFF)
option(BUILD_EXAMPLES "Build example executables" OFF)

# --- Library ---
### Library ###
add_library(c_traceback STATIC
src/error.c
src/error_codes.c
Expand All @@ -25,14 +25,14 @@ add_library(c_traceback STATIC
)
add_library(c_traceback::c_traceback ALIAS c_traceback)

# --- Standard (c99) ---
### Standard (c99) ###
set_target_properties(c_traceback PROPERTIES
C_STANDARD 99
C_STANDARD_REQUIRED ON
POSITION_INDEPENDENT_CODE ON
)

# --- Includes ---
### Includes ###
target_include_directories(c_traceback
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
Expand All @@ -41,7 +41,7 @@ target_include_directories(c_traceback
${CMAKE_CURRENT_SOURCE_DIR}/src/internal
)

# --- Warnings ---
### Warnings ###
if(MSVC)
target_compile_options(c_traceback PRIVATE /W4)
else()
Expand All @@ -51,18 +51,18 @@ else()
)
endif()

# --- Sanitizers ---
### Sanitizers ###
if(ENABLE_SANITIZERS)
if(NOT MSVC)
target_compile_options(c_traceback PRIVATE -fsanitize=address,undefined)
target_link_options(c_traceback PRIVATE -fsanitize=address,undefined)
endif()
endif()

# --- Definitions ---
### Definitions ###
target_compile_definitions(c_traceback PRIVATE CTB_VERSION="${PROJECT_VERSION}")

# --- Installation ---
### Installation ###
if(PROJECT_IS_TOP_LEVEL)
include(CMakePackageConfigHelpers)

Expand All @@ -78,7 +78,7 @@ if(PROJECT_IS_TOP_LEVEL)
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

# --- Package config & version ---
### Package config & version ###
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/c_tracebackConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
Expand All @@ -97,7 +97,7 @@ if(PROJECT_IS_TOP_LEVEL)
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/c_traceback"
)

# --- Export targets / install cmake files ---
### Export targets / install cmake files ###
install(EXPORT c_tracebackTargets
FILE c_tracebackTargets.cmake
NAMESPACE c_traceback::
Expand All @@ -110,13 +110,17 @@ if(PROJECT_IS_TOP_LEVEL)
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/c_traceback
)

# --- Build Examples ---
### Build Examples ###
if(BUILD_EXAMPLES)
enable_testing()

if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/examples/CMakeLists.txt")
add_subdirectory(examples)
endif()
endif()

endif()
endif()

### Testing ###
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/CMakeLists.txt")
enable_testing()
add_subdirectory(tests)
endif()
12 changes: 1 addition & 11 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,11 @@ file(GLOB EXAMPLE_SOURCES CONFIGURE_DEPENDS "example*.c")
foreach(SOURCE_FILE ${EXAMPLE_SOURCES})

get_filename_component(TARGET_NAME ${SOURCE_FILE} NAME_WE)

add_executable(${TARGET_NAME} ${SOURCE_FILE})
target_link_libraries(${TARGET_NAME} PRIVATE c_traceback::c_traceback)

if(ENABLE_SANITIZERS AND NOT MSVC)
target_compile_options(${TARGET_NAME} PRIVATE -fsanitize=address,undefined)
target_link_options(${TARGET_NAME} PRIVATE -fsanitize=address,undefined)
endif()

# Test
add_test(
NAME ${TARGET_NAME}
COMMAND ${CMAKE_COMMAND}
-DTEST_PROG=$<TARGET_FILE:${TARGET_NAME}>
-P ${CMAKE_CURRENT_SOURCE_DIR}/check_test.cmake
)

endforeach()
endforeach()
17 changes: 17 additions & 0 deletions examples/example_keyboard_interrupt.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include <stdio.h>

#include "c_traceback.h"

int main(void)
{
ctb_clear_context();
ctb_install_signal_handler();

printf("Press Ctrl+C to trigger a keyboard interrupt...\n");
while (1)
{
/* Do nothing */
}

return 0;
}
49 changes: 26 additions & 23 deletions examples/example_multi_error.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,8 @@
#define FILE_PATH1 "../test1.txt"
#define FILE_PATH2 "../test2.txt"

void open_file(const char *file_name)
{
FILE *file = fopen(file_name, "r");
if (!file)
{
THROW_FMT(CTB_FILE_NOT_FOUND_ERROR, "Failed to open file: \"%s\"", file_name);
return;
}
/* Do something */
fclose(file);
}

void do_something_risky()
{
int x = 0;
if (x == 0)
{
THROW(CTB_RUNTIME_ERROR, "Division by zero attempted");
return;
}
int y = 10 / x;
(void)y;
}
void open_file(const char *file_name);
void do_something_risky();

int main(void)
{
Expand All @@ -50,3 +29,27 @@ int main(void)
ctb_dump_traceback();
return 1;
}

void open_file(const char *file_name)
{
FILE *file = fopen(file_name, "r");
if (!file)
{
THROW_FMT(CTB_FILE_NOT_FOUND_ERROR, "Failed to open file: \"%s\"", file_name);
return;
}
/* Do something */
fclose(file);
}

void do_something_risky()
{
int x = 0;
if (x == 0)
{
THROW(CTB_RUNTIME_ERROR, "Division by zero attempted");
return;
}
int y = 10 / x;
(void)y;
}
24 changes: 13 additions & 11 deletions examples/example_open_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,7 @@

#define FILE_PATH "../test.txt"

void open_file(const char *file_name)
{
FILE *file = fopen(file_name, "r");
if (!file)
{
THROW_FMT(CTB_FILE_NOT_FOUND_ERROR, "Failed to open file: \"%s\"", file_name);
return;
}
/* Do something */
fclose(file);
}
void open_file(const char *file_name);

int main(void)
{
Expand All @@ -29,4 +19,16 @@ int main(void)
error:
ctb_dump_traceback();
return 1;
}

void open_file(const char *file_name)
{
FILE *file = fopen(file_name, "r");
if (!file)
{
THROW_FMT(CTB_FILE_NOT_FOUND_ERROR, "Failed to open file: \"%s\"", file_name);
return;
}
/* Do something */
fclose(file);
}
26 changes: 15 additions & 11 deletions examples/example_recursion.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,7 @@

#define N 100

void recursion(int count)
{
if (count >= N)
{
THROW_FMT(CTB_RUNTIME_ERROR, "Oh no, some error occurred at depth %d", count);
return;
}

TRACE(recursion(count + 1));
}
void recursion(int count);

int main(void)
{
Expand All @@ -23,7 +14,20 @@ int main(void)
TRY_GOTO(recursion(0), error);
printf("This shouldn't be printed if there is error");

return 0;

error:
ctb_dump_traceback(); // Log traceback and reset error stack
return 0;
return 1;
}

void recursion(int count)
{
if (count >= N)
{
THROW_FMT(CTB_RUNTIME_ERROR, "Oh no, some error occurred at depth %d", count);
return;
}

TRACE(recursion(count + 1));
}
2 changes: 1 addition & 1 deletion examples/example_seg_fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ int main(void)
{
ctb_clear_context();
ctb_install_signal_handler();
THROW(CTB_BUFFER_ERROR, "Hello! This is a test error before segfault.");
THROW(CTB_BUFFER_ERROR, "Hello! This is an error before segfault.");

TRACE(some_function());

Expand Down
23 changes: 23 additions & 0 deletions examples/example_stack_overflow.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include <stdio.h>
#include <string.h>

#include "c_traceback.h"

void stack_overflow(int depth)
{
char buffer[10240]; // Allocate some stack space
memset(buffer, 0, sizeof(buffer));
printf("Recursion depth: %d\n", depth);
stack_overflow(depth + 1);
}

int main(void)
{
ctb_clear_context();
ctb_install_signal_handler();

// Stack overflow
TRACE(stack_overflow(1));

return 0;
}
23 changes: 23 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
file(GLOB TEST_SOURCES CONFIGURE_DEPENDS "test*.c")

foreach(SOURCE_FILE ${TEST_SOURCES})

get_filename_component(TARGET_NAME ${SOURCE_FILE} NAME_WE)

add_executable(${TARGET_NAME} ${SOURCE_FILE})
target_link_libraries(${TARGET_NAME} PRIVATE c_traceback::c_traceback)

if(ENABLE_SANITIZERS AND NOT MSVC)
target_compile_options(${TARGET_NAME} PRIVATE -fsanitize=address,undefined)
target_link_options(${TARGET_NAME} PRIVATE -fsanitize=address,undefined)
endif()

# Test
add_test(
NAME ${TARGET_NAME}
COMMAND ${CMAKE_COMMAND}
-DTEST_PROG=$<TARGET_FILE:${TARGET_NAME}>
-P ${CMAKE_CURRENT_SOURCE_DIR}/check_test.cmake
)

endforeach()
File renamed without changes.
Loading