Использование анализа безопасности потока Clang с shared_ptr - PullRequest
0 голосов
/ 05 декабря 2018

Я смотрю на Анализ безопасности потока Clang с Clang 7.0

Однако при попытке использовать аннотацию PT_GUARDED_BY с данными shared_ptr я получаю сообщение об ошибкечлены:

ошибка: 'pt_guarded_by' применяется только к типам указателей;введите здесь 'shared_ptr ' [-Werror, -Wthread-safety-attribute]

Это немного сбивает с толку меня, так как документация гласит: "PT_GUARDED_BY ... предназначен для использования"на указатели и умные указатели. ", и даже приводит пример, который использует std :: unique_ptr (используя в основном тот же синтаксис, который я использую).

Является ли std :: shared_ptr несовместимым с анализом безопасности потоков Clang, илиздесь что-то еще происходит?Как мне следует заявить, что к указанному классу нельзя обращаться без удержания блокировки на связанном мьютексе?

(Это в Linux, используя стандартную библиотеку GCC libstdc ++, если это имеет значение.)


После некоторых экспериментов похоже, что это происходит только в том случае, если shared_ptr является переменной-членом, а не глобальной.

#include "mutex.h" // The suggested mutex.h file from the Clang Thread Safety Analysis page
#include <memory>

Mutex mu;

std::shared_ptr< int > toplevel PT_GUARDED_BY(mu); // Okay

class Wrapper {
public:
  std::shared_ptr< int > member PT_GUARDED_BY(mu); // Results in error
};

void test() {
  Wrapper wrapped;
  wrapped.member = std::shared_ptr< int >( new int ); // Should be OK
  *wrapped.member = 42; // Should raise warning
}

Замечу, что если я поменяю unique_ptr на shared_ptr, то глобальная переменная и переменная-член будут работать нормально.

1 Ответ

0 голосов
/ 06 декабря 2018

Немного поиграв с различными компиляциями Clang и различными стандартными библиотеками C ++, я думаю, я понял это.

Это ошибка в Clang 7.0.0 при использовании в сочетании с (GCC) libstdc ++.

Если вы используете текущий (4 декабря 2018 г.) магистральный Clang (так, что в конечном итоге станет 8.0.0), все будет работать, как ожидается, с обоими (GCC) libstdc ++ и (Clang) libc ++.

Если вы используете Clang 7.0.0, все работает должным образом с (Clang trunk's) libc ++, но выдает вышеуказанную ошибку, если вы используете его с (GCC) libstdc ++ ... по крайней мере для libstdc ++ из диапазона GCC 4.8 - GCC 6.2 (которыйэто то, что у меня было под рукой, чтобы проверить.).

...