По поводу RAII: как предотвратить ошибки, вызванные случайным созданием временного?
Некоторое время коллега сказал мне, что он потратил много времени на отладку состояния гонки. Виновником оказалось что-то вроде этого:
void foo()
{
ScopedLock(this->mutex); // Oops, should have been a named object.
// Edit: added the "this->" to fix compilation issue.
// ....
}
Чтобы предотвратить повторение ситуации, он создал следующий макрос после определения класса ScopedLock:
#define ScopedLock(...) Error_You_should_create_a_named_object;
Этот патч работает отлично.
Кто-нибудь знает какие-либо другие интересные методы, чтобы предотвратить эту проблему?
2 ответа
Если вы собираетесь определить макрос, я бы лучше определил этот:
#define GET_SCOPED_LOCK(name, mtx) ScopedLock name(mtx)
и прекратить создание объектов, отличных от макроса.
Тогда переименуй ScopedLock
в ThisClassNameShouldNotAppearInUserCode
если это поможет
Вы должны использовать статический анализатор кода, такой как Cppcheck. Для следующего кода:
class a { };
void f() {
a();
}
cppcheck генерирует следующий вывод:
$ cppcheck test.cpp
Checking test.cpp...
[test.cpp:4]: (error) instance of "a" object destroyed immediately
Существует также множество других распространенных ошибок кодирования.
(Я довольно новый участник Cppcheck. Я нашел его пару месяцев назад, и с ним было здорово работать.)