clang静态分析器核心是否支持多线程程序?
Does clang static analyzer core support multi-threaded programs?
无法找到有关 clang 静态分析器核心在观察多线程编程构造时的行为的任何文档。核心是否识别它们并为每个线程创建单独的路径?
不,Clang 静态分析器不会尝试直接分析多个线程的同时执行。相反,它一次分析一条路径。引用 developer manual:
The analyzer core performs symbolic execution of the given program. All the input values are represented with symbolic values; further, the engine deduces the values of all the expressions in the program based on the input symbols and the path. The execution is path sensitive and every possible path through the program is explored.
Clang 执行的 thread-related 检查是在单个路径的上下文中完成的。略读 list of available checkers,我发现了三个与 C/C++ 线程相关的(也有一些与 Objective C 相关):
alpha.core.C11Lock: Checks use of the mtx_t
API,尤其是 double-locking 和(我假设)未能释放锁。
alpha.unix.PthreadLock: Similar checking for pthread_mutex_lock
及相关函数。
optin.mpi.MPI-Checker: Checks use of the MPI API,例如代码在使用数据之前等待消息接收操作完成。
除了这些检查器之外,还有 Clang Thread Safety Analysis 系统,它依靠 programmer-provided 注释来(主要)强制正确使用互斥体以保护共享数据。
所有这些的共同点是,强制执行的属性需要在单个线程的上下文中正确使用 API。分析器不需要考虑其他线程可能正在做什么来诊断这些问题。
一些商业静态分析工具有更多和更复杂的分析来检测线程代码的问题,并且可能会考虑沿多个独立(和潜在并发)路径发生的情况,但它们也不直接分析交错的可能性。
有直接考虑并发执行和交错的技术,通常使用 model checking 算法的一些变体,但是让这些技术扩展到大于几十行代码的程序是一个开放领域研究。
无法找到有关 clang 静态分析器核心在观察多线程编程构造时的行为的任何文档。核心是否识别它们并为每个线程创建单独的路径?
不,Clang 静态分析器不会尝试直接分析多个线程的同时执行。相反,它一次分析一条路径。引用 developer manual:
The analyzer core performs symbolic execution of the given program. All the input values are represented with symbolic values; further, the engine deduces the values of all the expressions in the program based on the input symbols and the path. The execution is path sensitive and every possible path through the program is explored.
Clang 执行的 thread-related 检查是在单个路径的上下文中完成的。略读 list of available checkers,我发现了三个与 C/C++ 线程相关的(也有一些与 Objective C 相关):
alpha.core.C11Lock: Checks use of the
mtx_t
API,尤其是 double-locking 和(我假设)未能释放锁。alpha.unix.PthreadLock: Similar checking for
pthread_mutex_lock
及相关函数。optin.mpi.MPI-Checker: Checks use of the MPI API,例如代码在使用数据之前等待消息接收操作完成。
除了这些检查器之外,还有 Clang Thread Safety Analysis 系统,它依靠 programmer-provided 注释来(主要)强制正确使用互斥体以保护共享数据。
所有这些的共同点是,强制执行的属性需要在单个线程的上下文中正确使用 API。分析器不需要考虑其他线程可能正在做什么来诊断这些问题。
一些商业静态分析工具有更多和更复杂的分析来检测线程代码的问题,并且可能会考虑沿多个独立(和潜在并发)路径发生的情况,但它们也不直接分析交错的可能性。
有直接考虑并发执行和交错的技术,通常使用 model checking 算法的一些变体,但是让这些技术扩展到大于几十行代码的程序是一个开放领域研究。