【发布时间】: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