У меня есть оболочка C ++ для std::mutex
, которая имеет некоторые дополнительные средства отладки и отслеживает некоторые грубые метрики конкуренции. Грубо говоря, это эквивалентно этому:
struct Mutex {
std::mutex m;
_Acquires_lock_(m) void lock() {m.lock();}
_Requires_lock_held_(m) _Releases_lock_(m) void unlock() {m.unlock();}
_When_(return==true,_Acquires_lock_(m)) bool try_lock() {return m.try_lock();}
};
У меня также есть объект C ++, который соответствует BasicLockable
. Внутри него есть мьютекс, а его функции lock
/ unlock
/ try_lock
соответствуют эквивалентам мьютекса. BasicLockable
аспекты этого объекта тогда выглядят так:
struct Thing {
Mutex m;
_Acquires_lock_(m) void lock() {m.lock();}
_Requires_lock_held_(m) _Releases_lock_(m) void unlock() {m.unlock();}
_When_(return==true,_Acquires_lock_(m)) bool try_lock() {return m.try_lock();}
};
При вызове для анализа этого кода Visual Studio совершенно правильно указывает на допустимую потенциальную проблему с Thing::lock
:
warning C26115: Failing to release lock '(&this->m)->m' in function 'Thing::lock'.
Что очень верно, но в этом случае эта функция в порядке. Это не должно открывать замок. Мне нужна разметка SAL на Mutex::lock
(и т. Д.), Чтобы можно было проверить пользователей на Mutex
; Мне нужна разметка SAL на Thing::lock
(и т. Д.), Чтобы пользователи Thing
могли проверяться; но мне не нужно проверять Thing
использование Mutex
, потому что я проверил это на глаз и достаточно доволен, что все в порядке, что мне не нужно анализировать предупреждение об этом.
Как я могу это сделать?
Мне не удалось найти ничего особенно очевидного в документации.