harden error_strings[] safety and update .gitignore
- Add ERROR_COUNT sentinel to SystemError_t enum - Change error_strings[] to static const char* const - Add static_assert to enforce enum/array sync at compile time - Add runtime bounds check with fallback for invalid error codes - Add all missing test binary names to .gitignore
This commit is contained in:
@@ -620,7 +620,8 @@ typedef enum {
|
|||||||
ERROR_POWER_SUPPLY,
|
ERROR_POWER_SUPPLY,
|
||||||
ERROR_TEMPERATURE_HIGH,
|
ERROR_TEMPERATURE_HIGH,
|
||||||
ERROR_MEMORY_ALLOC,
|
ERROR_MEMORY_ALLOC,
|
||||||
ERROR_WATCHDOG_TIMEOUT
|
ERROR_WATCHDOG_TIMEOUT,
|
||||||
|
ERROR_COUNT // must be last — used for bounds checking error_strings[]
|
||||||
} SystemError_t;
|
} SystemError_t;
|
||||||
|
|
||||||
static SystemError_t last_error = ERROR_NONE;
|
static SystemError_t last_error = ERROR_NONE;
|
||||||
@@ -867,7 +868,7 @@ void handleSystemError(SystemError_t error) {
|
|||||||
DIAG_ERR("SYS", "handleSystemError: error=%d error_count=%lu", error, error_count);
|
DIAG_ERR("SYS", "handleSystemError: error=%d error_count=%lu", error, error_count);
|
||||||
|
|
||||||
char error_msg[100];
|
char error_msg[100];
|
||||||
const char* error_strings[] = {
|
static const char* const error_strings[] = {
|
||||||
"No error",
|
"No error",
|
||||||
"AD9523 Clock failure",
|
"AD9523 Clock failure",
|
||||||
"ADF4382 TX LO unlocked",
|
"ADF4382 TX LO unlocked",
|
||||||
@@ -887,9 +888,16 @@ void handleSystemError(SystemError_t error) {
|
|||||||
"Watchdog timeout"
|
"Watchdog timeout"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(error_strings) / sizeof(error_strings[0]) == ERROR_COUNT,
|
||||||
|
"error_strings[] and SystemError_t enum are out of sync");
|
||||||
|
|
||||||
|
const char* err_name = (error >= 0 && error < (int)(sizeof(error_strings) / sizeof(error_strings[0])))
|
||||||
|
? error_strings[error]
|
||||||
|
: "Unknown error";
|
||||||
|
|
||||||
snprintf(error_msg, sizeof(error_msg),
|
snprintf(error_msg, sizeof(error_msg),
|
||||||
"ERROR #%d: %s (Count: %lu)\r\n",
|
"ERROR #%d: %s (Count: %lu)\r\n",
|
||||||
error, error_strings[error], error_count);
|
error, err_name, error_count);
|
||||||
HAL_UART_Transmit(&huart3, (uint8_t*)error_msg, strlen(error_msg), 1000);
|
HAL_UART_Transmit(&huart3, (uint8_t*)error_msg, strlen(error_msg), 1000);
|
||||||
|
|
||||||
// Blink LED pattern based on error code
|
// Blink LED pattern based on error code
|
||||||
@@ -915,7 +923,7 @@ void handleSystemError(SystemError_t error) {
|
|||||||
if ((error >= ERROR_RF_PA_OVERCURRENT && error <= ERROR_POWER_SUPPLY) ||
|
if ((error >= ERROR_RF_PA_OVERCURRENT && error <= ERROR_POWER_SUPPLY) ||
|
||||||
error == ERROR_TEMPERATURE_HIGH ||
|
error == ERROR_TEMPERATURE_HIGH ||
|
||||||
error == ERROR_WATCHDOG_TIMEOUT) {
|
error == ERROR_WATCHDOG_TIMEOUT) {
|
||||||
DIAG_ERR("SYS", "CRITICAL ERROR (code %d: %s) -- initiating Emergency_Stop()", error, error_strings[error]);
|
DIAG_ERR("SYS", "CRITICAL ERROR (code %d: %s) -- initiating Emergency_Stop()", error, err_name);
|
||||||
snprintf(error_msg, sizeof(error_msg),
|
snprintf(error_msg, sizeof(error_msg),
|
||||||
"CRITICAL ERROR! Initiating emergency shutdown.\r\n");
|
"CRITICAL ERROR! Initiating emergency shutdown.\r\n");
|
||||||
HAL_UART_Transmit(&huart3, (uint8_t*)error_msg, strlen(error_msg), 1000);
|
HAL_UART_Transmit(&huart3, (uint8_t*)error_msg, strlen(error_msg), 1000);
|
||||||
|
|||||||
@@ -3,18 +3,38 @@
|
|||||||
*.dSYM/
|
*.dSYM/
|
||||||
|
|
||||||
# Test binaries (built by Makefile)
|
# Test binaries (built by Makefile)
|
||||||
|
# TESTS_WITH_REAL
|
||||||
test_bug1_timed_sync_init_ordering
|
test_bug1_timed_sync_init_ordering
|
||||||
test_bug2_ad9523_double_setup
|
|
||||||
test_bug3_timed_sync_noop
|
test_bug3_timed_sync_noop
|
||||||
test_bug4_phase_shift_before_check
|
test_bug4_phase_shift_before_check
|
||||||
test_bug5_fine_phase_gpio_only
|
test_bug5_fine_phase_gpio_only
|
||||||
|
test_bug9_platform_ops_null
|
||||||
|
test_bug10_spi_cs_not_toggled
|
||||||
|
test_bug15_htim3_dangling_extern
|
||||||
|
|
||||||
|
# TESTS_MOCK_ONLY
|
||||||
|
test_bug2_ad9523_double_setup
|
||||||
test_bug6_timer_variable_collision
|
test_bug6_timer_variable_collision
|
||||||
test_bug7_gpio_pin_conflict
|
test_bug7_gpio_pin_conflict
|
||||||
test_bug8_uart_commented_out
|
test_bug8_uart_commented_out
|
||||||
test_bug9_platform_ops_null
|
test_bug14_diag_section_args
|
||||||
test_bug10_spi_cs_not_toggled
|
test_gap3_emergency_stop_rails
|
||||||
test_bug11_platform_spi_transmit_only
|
|
||||||
|
# TESTS_STANDALONE
|
||||||
test_bug12_pa_cal_loop_inverted
|
test_bug12_pa_cal_loop_inverted
|
||||||
test_bug13_dac2_adc_buffer_mismatch
|
test_bug13_dac2_adc_buffer_mismatch
|
||||||
test_bug14_diag_section_args
|
test_gap3_iwdg_config
|
||||||
test_bug15_htim3_dangling_extern
|
test_gap3_temperature_max
|
||||||
|
test_gap3_idq_periodic_reread
|
||||||
|
test_gap3_emergency_state_ordering
|
||||||
|
test_gap3_overtemp_emergency_stop
|
||||||
|
test_gap3_health_watchdog_cold_start
|
||||||
|
|
||||||
|
# TESTS_WITH_PLATFORM
|
||||||
|
test_bug11_platform_spi_transmit_only
|
||||||
|
|
||||||
|
# TESTS_WITH_CXX
|
||||||
|
test_agc_outer_loop
|
||||||
|
|
||||||
|
# Manual / one-off test builds
|
||||||
|
test_um982_gps
|
||||||
|
|||||||
Reference in New Issue
Block a user