Coverity Scan¶
Coverity Scan 是一项用于开源项目静态代码分析的免费服务。它基于 Coverity 的商业产品,能够分析 C、C++ 和 Java 代码。
Coverity 的静态代码分析不会运行代码。它使用抽象解释来获取有关代码控制流和数据流的信息。它能够跟踪程序可能采取的所有可能的代码路径。例如,分析器理解 结果可在 Coverity Scan 网站上获得。为了访问结果,您必须自己创建一个帐户。然后转到使用 Scan 的项目,将自己添加到 Python 项目中。新成员必须经管理员批准(请参阅 联系方式)。 访问仅限于 Python 核心开发人员。其他个人也可以由我们自行决定授予访问权限。时不时,Coverity 会在 Python 的代码中检测到一个严重问题——新的分析器甚至可以在成熟的代码中找到新的错误。我们不想过早地披露问题。malloc()
返回的内存必须稍后使用
访问分析报告¶
构建和上传分析¶
该过程是自动化的。一个脚本签出代码,运行 cov-build
并将最新的分析上传到 Coverity。由于 Coverity 限制了每周的最大构建数,因此 Python 每隔一天分析一次。构建在俄亥俄州立大学开源实验室 PSF 基础设施上的专用虚拟机上运行。该过程由 Christian Heimes 维护(请参阅 联系方式)。目前,仅使用 64 位 Linux 工具分析提示。
已知限制¶
Coverity 尚未理解 Python 的 C 代码的某些方面。
误报¶
Py_BuildValue("N", PyObject*)
Coverity 不理解
N
格式字符在不触及引用计数的情况下传递对象。基于此,分析器检测到资源泄漏。CID 719685PyLong_FromLong()
用于负值Coverity 声称
PyLong_FromLong()
和其他PyLong_From*()
函数无法处理负值,因为该值可能会在get_small_int()
中用作数组索引。CID 486783PyLong_FromLong()
用于 n [-5 … +255]对于 Python 的小整数缓存范围内的整数,
PyLong_From*()
函数永远不会失败,也永远不会返回 NULL。CID 1058291PyArg_ParseTupleAndKeywords(args, kwargs, "s#", &data, &length)
一些函数使用格式字符组合,例如
s#
、u#
或z#
来获取字符数组的数据和长度。Coverity 无法识别数据和长度之间的关系。有时,如果将数据写入固定大小的缓冲区,即使length <= sizeof(buffer)
,它也会检测到缓冲区溢出。CID 486613path_converter()
在空检查后取消引用posixmodule.c
中的path_converter()
函数确保填充path_t.narrow
或path_t.wide
,除非明确启用了path_t.nullable
。CID 719648
建模¶
建模在 Coverity Connect 的帮助菜单中提供的Coverity 帮助中心中进行了说明。 coverity_model.c 包含 Python 的 Coverity 建模文件的副本。请将副本与 Coverity Scan 的分析设置中的模型文件保持同步。
工作流¶
误报和故意问题¶
如果问题列在 已知限制 下,请将分类设置为“误报”或“故意”,将操作设置为“忽略”,将所有者设置为您自己的帐户,并添加一条注释说明为什么该问题被认为是误报或故意。
如果您认为这是一个新的误报或故意,请联系管理员。第一步应该是更新 Python 的 建模 文件。
正面问题¶
除非确实无关紧要,否则你应该始终创建问题。请在外部参考下将完整的 URL 添加到工单,并将 CID(Coverity ID)添加到工单和签入消息中。这使得理解工单、修复和 Coverity 问题之间的关系变得容易得多。
联系¶
请在任何有关 Coverity 的邮件中同时包含 Brett 和 Christian。发给 Coverity 的邮件也应通过 Brett 或 Christian 转发。
- Christian Heimes <christian (at) python (dot) org>
管理员、构建机器维护者、Python 和 Coverity 之间的中间人
- Brett Cannon <brett (at) python (dot) org>
联合管理员
- Dakshesh Vyas <scan-admin@coverity.com>
技术经理 - Coverity 扫描
另请参阅