По поводу RAII: Как предотвратить ошибки, вызванные случайным созданием временного? - PullRequest
10 голосов
/ 01 марта 2011

Некоторое время коллега сказал мне, что он потратил много времени на отладку состояния гонки.Виновник оказался примерно таким:

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;

Thisпатч работает отлично.

Кто-нибудь знает какие-нибудь другие интересные методы, чтобы предотвратить эту проблему?

Ответы [ 2 ]

8 голосов
/ 01 марта 2011

Вы должны использовать статический анализатор кода, такой как Cppcheck . Для следующего кода:

class a { };

void f() {
    a();
}

cppcheck генерирует следующий вывод:

$ cppcheck test.cpp
Checking test.cpp...
[test.cpp:4]: (error) instance of "a" object destroyed immediately

Существует также множество других распространенных ошибок кодирования.

(Я довольно новый участник Cppcheck. Я нашел его пару месяцев назад, и с ним было здорово работать.)

3 голосов
/ 01 марта 2011

Если вы собираетесь определить макрос, я бы лучше определил этот:

#define GET_SCOPED_LOCK(name, mtx) ScopedLock name(mtx)

и прекратить создание объектов, отличных от макроса.

Затем переименуйте ScopedLock в ThisClassNameShouldNotAppearInUserCode, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...