diff options
author | iphydf <iphydf@users.noreply.github.com> | 2018-10-08 23:53:04 +0000 |
---|---|---|
committer | iphydf <iphydf@users.noreply.github.com> | 2018-10-19 18:08:46 +0000 |
commit | aa5c7828802b3fcaedfd8d6fe9a08ca714b9aa2b (patch) | |
tree | ccdf7bb4d10995d03e4b385589cdbea3d4eb97b6 /toxcore | |
parent | 1eaa55d2d4f62e73204d8f68ce05fdebb1ab827c (diff) |
Add `LOGGER_ASSERT` for checking fatal error conditions.
These are not compiled out under `NDEBUG` and should be provably correct.
Diffstat (limited to 'toxcore')
-rw-r--r-- | toxcore/logger.c | 3 | ||||
-rw-r--r-- | toxcore/logger.h | 14 | ||||
-rw-r--r-- | toxcore/tox.c | 21 |
3 files changed, 28 insertions, 10 deletions
diff --git a/toxcore/logger.c b/toxcore/logger.c index 51c30ede..80833219 100644 --- a/toxcore/logger.c +++ b/toxcore/logger.c | |||
@@ -104,7 +104,8 @@ void logger_write(const Logger *log, Logger_Level level, const char *file, int l | |||
104 | #ifdef USE_STDERR_LOGGER | 104 | #ifdef USE_STDERR_LOGGER |
105 | log = &logger_stderr; | 105 | log = &logger_stderr; |
106 | #else | 106 | #else |
107 | assert(!"NULL logger not permitted"); | 107 | fprintf(stderr, "NULL logger not permitted.\n"); |
108 | abort(); | ||
108 | #endif | 109 | #endif |
109 | } | 110 | } |
110 | 111 | ||
diff --git a/toxcore/logger.h b/toxcore/logger.h index 2cae7a0e..3abed896 100644 --- a/toxcore/logger.h +++ b/toxcore/logger.h | |||
@@ -91,4 +91,18 @@ void logger_write( | |||
91 | #define LOGGER_WARNING(log, ...) LOGGER_WRITE(log, LOGGER_LEVEL_WARNING, __VA_ARGS__) | 91 | #define LOGGER_WARNING(log, ...) LOGGER_WRITE(log, LOGGER_LEVEL_WARNING, __VA_ARGS__) |
92 | #define LOGGER_ERROR(log, ...) LOGGER_WRITE(log, LOGGER_LEVEL_ERROR , __VA_ARGS__) | 92 | #define LOGGER_ERROR(log, ...) LOGGER_WRITE(log, LOGGER_LEVEL_ERROR , __VA_ARGS__) |
93 | 93 | ||
94 | #define LOGGER_FATAL(log, ...) \ | ||
95 | do { \ | ||
96 | LOGGER_ERROR(log, __VA_ARGS__); \ | ||
97 | abort(); \ | ||
98 | } while(0) | ||
99 | |||
100 | #define LOGGER_ASSERT(log, cond, ...) \ | ||
101 | do { \ | ||
102 | if (!(cond)) { \ | ||
103 | LOGGER_ERROR(log, "Assertion failed"); \ | ||
104 | LOGGER_FATAL(log, __VA_ARGS__); \ | ||
105 | } \ | ||
106 | } while(0) | ||
107 | |||
94 | #endif // C_TOXCORE_TOXCORE_LOGGER_H | 108 | #endif // C_TOXCORE_TOXCORE_LOGGER_H |
diff --git a/toxcore/tox.c b/toxcore/tox.c index 5258e9b6..e679a168 100644 --- a/toxcore/tox.c +++ b/toxcore/tox.c | |||
@@ -530,7 +530,7 @@ void tox_kill(Tox *tox) | |||
530 | } | 530 | } |
531 | 531 | ||
532 | Messenger *m = tox->m; | 532 | Messenger *m = tox->m; |
533 | assert(m->msi_packet == nullptr && "Attempted to kill tox while toxav is still alive"); | 533 | LOGGER_ASSERT(m->log, m->msi_packet == nullptr, "Attempted to kill tox while toxav is still alive"); |
534 | kill_groupchats(m->conferences_object); | 534 | kill_groupchats(m->conferences_object); |
535 | kill_messenger(m); | 535 | kill_messenger(m); |
536 | mono_time_free(tox->mono_time); | 536 | mono_time_free(tox->mono_time); |
@@ -793,7 +793,7 @@ Tox_User_Status tox_self_get_status(const Tox *tox) | |||
793 | return (Tox_User_Status)status; | 793 | return (Tox_User_Status)status; |
794 | } | 794 | } |
795 | 795 | ||
796 | static void set_friend_error(int32_t ret, Tox_Err_Friend_Add *error) | 796 | static void set_friend_error(const Logger *log, int32_t ret, Tox_Err_Friend_Add *error) |
797 | { | 797 | { |
798 | switch (ret) { | 798 | switch (ret) { |
799 | case FAERR_TOOLONG: | 799 | case FAERR_TOOLONG: |
@@ -826,7 +826,7 @@ static void set_friend_error(int32_t ret, Tox_Err_Friend_Add *error) | |||
826 | 826 | ||
827 | default: | 827 | default: |
828 | /* can't happen */ | 828 | /* can't happen */ |
829 | assert(!"impossible: unknown friend-add error"); | 829 | LOGGER_FATAL(log, "impossible: unknown friend-add error"); |
830 | break; | 830 | break; |
831 | } | 831 | } |
832 | } | 832 | } |
@@ -847,7 +847,7 @@ uint32_t tox_friend_add(Tox *tox, const uint8_t *address, const uint8_t *message | |||
847 | return ret; | 847 | return ret; |
848 | } | 848 | } |
849 | 849 | ||
850 | set_friend_error(ret, error); | 850 | set_friend_error(m->log, ret, error); |
851 | return UINT32_MAX; | 851 | return UINT32_MAX; |
852 | } | 852 | } |
853 | 853 | ||
@@ -866,7 +866,7 @@ uint32_t tox_friend_add_norequest(Tox *tox, const uint8_t *public_key, Tox_Err_F | |||
866 | return ret; | 866 | return ret; |
867 | } | 867 | } |
868 | 868 | ||
869 | set_friend_error(ret, error); | 869 | set_friend_error(m->log, ret, error); |
870 | return UINT32_MAX; | 870 | return UINT32_MAX; |
871 | } | 871 | } |
872 | 872 | ||
@@ -1026,7 +1026,7 @@ bool tox_friend_get_status_message(const Tox *tox, uint32_t friend_number, uint8 | |||
1026 | } | 1026 | } |
1027 | 1027 | ||
1028 | const int ret = m_copy_statusmessage(m, friend_number, status_message, size); | 1028 | const int ret = m_copy_statusmessage(m, friend_number, status_message, size); |
1029 | assert(ret == size && "concurrency problem: friend status message changed"); | 1029 | LOGGER_ASSERT(m->log, ret == size, "concurrency problem: friend status message changed"); |
1030 | 1030 | ||
1031 | SET_ERROR_PARAMETER(error, TOX_ERR_FRIEND_QUERY_OK); | 1031 | SET_ERROR_PARAMETER(error, TOX_ERR_FRIEND_QUERY_OK); |
1032 | return ret == size; | 1032 | return ret == size; |
@@ -1109,7 +1109,7 @@ bool tox_self_set_typing(Tox *tox, uint32_t friend_number, bool typing, Tox_Err_ | |||
1109 | return 1; | 1109 | return 1; |
1110 | } | 1110 | } |
1111 | 1111 | ||
1112 | static void set_message_error(int ret, Tox_Err_Friend_Send_Message *error) | 1112 | static void set_message_error(const Logger *log, int ret, Tox_Err_Friend_Send_Message *error) |
1113 | { | 1113 | { |
1114 | switch (ret) { | 1114 | switch (ret) { |
1115 | case 0: | 1115 | case 0: |
@@ -1133,9 +1133,12 @@ static void set_message_error(int ret, Tox_Err_Friend_Send_Message *error) | |||
1133 | break; | 1133 | break; |
1134 | 1134 | ||
1135 | case -5: | 1135 | case -5: |
1136 | LOGGER_FATAL(log, "impossible: Messenger and Tox disagree on message types"); | ||
1137 | break; | ||
1138 | |||
1136 | default: | 1139 | default: |
1137 | /* can't happen */ | 1140 | /* can't happen */ |
1138 | assert(!"impossible: unknown send-message error"); | 1141 | LOGGER_FATAL(log, "impossible: unknown send-message error: %d", ret); |
1139 | break; | 1142 | break; |
1140 | } | 1143 | } |
1141 | } | 1144 | } |
@@ -1155,7 +1158,7 @@ uint32_t tox_friend_send_message(Tox *tox, uint32_t friend_number, Tox_Message_T | |||
1155 | 1158 | ||
1156 | Messenger *m = tox->m; | 1159 | Messenger *m = tox->m; |
1157 | uint32_t message_id = 0; | 1160 | uint32_t message_id = 0; |
1158 | set_message_error(m_send_message_generic(m, friend_number, type, message, length, &message_id), error); | 1161 | set_message_error(m->log, m_send_message_generic(m, friend_number, type, message, length, &message_id), error); |
1159 | return message_id; | 1162 | return message_id; |
1160 | } | 1163 | } |
1161 | 1164 | ||