Я бы сделал 2 вещи, чтобы проверить ваш код. Тщательный групповой обзор кода (с целью поиска ошибок повторного входа, а не стиля или других ошибок). Во-вторых, практическая атака на проблемы.
Например:
int myfunction(int x, int y) {
REENTRANCE_CHECK;
... body of function
}
Теперь вы можете #define REENTRANCE_CHECK быть либо пустым (для производства) или некоторый код, который проверяет функцию никогда не введен заново. Запустите тесты (если у вас нет тестов, а затем запустите их на своем устройстве с прикрепленным отладчиком), если эти проверки включены, и посмотрите, что-то не происходит.
Аналогичным образом вы можете добавить логику отладки, чтобы обнаружить неверные обновления в глобальном состоянии.Написать код, который использует блокировки (которые утверждающие, если они приобрели, когда уже провели
Что-то вроде этого:.
int my_global;
DEFINE_GLOBAL_LOCK(my_global);
void my_dangerous_function() {
...
LOCK_GLOBAL(my_global);
.. some critical section of code that uses my_global.
UNLOCK_GLOBAL(my_global);
...
}
Again, DECLARE_GLOBAL_LOCK, LOCK_GLOBAL и UNLOCK_GLOBAL можно либо с помощью #define, чтобы быть реальным код блокировки (которые, конечно же, вам придется писать) для тестирования, а для производства они могут быть # неопределенными ни в чем.
Этот подход работает только в том случае, если вы обнаружите и завершите все обращения к вашему глобальному состоянию, но это легко с поиском
Когда я делаю такого рода экспертизу кода, первое, что я смотрю, это мои глобальные перемены. Функции, которые непосредственно получают доступ к глобальным переменным или управляют ими, обычно являются функциями с большинством проблем с повторным подключением. Как упоминалось выше, функции, которые изменяют только аргументы функции или внутренние данные, как правило, хорошо. Не забудьте проверить, что любые функции библиотеки, которые вы вызываете (включая стандартные функции библиотеки), являются потокобезопасными! – bta
Понял. Спасибо Secure & bta за консультацию. – 2010-01-26 01:42:27
«скрытые обратными вызовами/зависимостью» или обработчики сигналов, только для полноты. –