【问题标题】:Using Clang thread-safety analysis with C11 and __attribute__((cleanup))对 C11 和 __attribute__((cleanup)) 使用 Clang 线程安全分析
【发布时间】:2021-01-02 19:39:47
【问题描述】:

我有一个用 C(不是 C++)编写的自定义线程和锁库,我想使用 Clang 的线程安全分析。

C 似乎一切正常,除了一个伪 RAII 助手,我有那个模仿 C++ 的 std::lock_guard。它看起来像这样,

static inline mutex_t* _mutex_autolock_lock(mutex_t* m) {
  mutex_lock(m);
  return m;
}
static inline void _mutex_autolock_unlock(mutex_t** m) {
  mutex_unlock(*m);
}
#define MUTEX_AUTO_LOCK(name, lock) \
  mutex_t* name __attribute__((cleanup(_mutex_autolock_unlock))) = \
    _mutex_autolock_lock(lock); \
  (void)name;

然后代码可以这样使用它,

{
  MUTEX_AUTO_LOCK(scoped_lock, &mu);
  foo();
  // scoped_lock goes out of scope and automatically unlocks mu
}

我无法使用 Clang 的 SCOPED_CAPABILITY 进行这项工作,因为 (AFAICT) 需要一个构造函数,而我在 C 中没有这个构造函数。有没有办法对此建模/注释它以便 Clang 可以使用它线程安全分析?

【问题讨论】:

  • 我还没有找到答案,但不幸的是,我发现了几个更大的差距,这使得线程安全分析对 C 代码的用处大大降低。 #1:结构字段不能像 C++ 中的类成员那样被注释(bugs.llvm.org/show_bug.cgi?id=20403)。 #2:在 C++ 中,方法调用被隐式认为是对对象的访问 --- 没有办法通过函数调用来复制它,例如linked_list_push(linked_list* list) 函数调用永远不会被视为对传递列表的访问。

标签: c thread-safety clang static-analysis


【解决方案1】:

我不知道这是否回答了你的问题,但你可能想看看这个:Thread Safety Analysis (TSA) for C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多