Игнорирование аннотаций SAL в конкретном экземпляре - PullRequest
0 голосов
/ 04 июля 2019

У меня есть оболочка 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, потому что я проверил это на глаз и достаточно доволен, что все в порядке, что мне не нужно анализировать предупреждение об этом.

Как я могу это сделать?

Мне не удалось найти ничего особенно очевидного в документации.

...