开放的 Clang 项目
以下是一些您可以参与的项目,您可以根据自己的兴趣选择。这个列表只是提供一些想法,并不完全涵盖所有项目。如果您需要更多信息,或想确认某个项目是否已被完成,请在 Discourse 上咨询。
- 更新和改进 Clang 的文档: Clang 在文档化实现定义行为方面存在不一致性。我们在 语言扩展 页面上提供了大量的文档,但信息不完整,页面导航也很困难。我们希望您能帮助我们这些项目彼此独立。
- 完成对 Clang 的 C 语言一致性的调查: Clang 的 C 状态页面 包含许多标记为
Unknown
的条目。完成调查需要为各种标准文件添加 测试覆盖率 并相应地更新文档。 - 提高 Clang 的 C 和 C++ 语言标准一致性测试覆盖率: Clang 的测试套件的结构使得大多数测试都针对该功能的实现存在于编译器的哪个部分进行编写;我们在
clang/test/Parser
中有解析测试,在clang/test/Sema*
等中进行语义分析测试。我们还编写了一些测试来提供对标准要求的覆盖率(clang/test/CXX
和clang/test/C
)。标准覆盖率的结构不利于维护,因为标准会随着时间的推移而发生变化。没有任何商业一致性测试套件具有适合开源项目的许可证模型,因此我们希望您能帮助我们改进现有的覆盖率,无论是测试的布局,还是对各种标准模式的覆盖率。 - 完成对 Clang 的 C 和 C++ 缺陷报告一致性的调查: 与一般一致性测试分开(但相关)的是确定 Clang 实现了哪些 C 缺陷报告 和 C++ 缺陷报告。这些列表当前有许多条目标记为
Unknown
。完成调查需要为 C 和 C++ 缺陷报告添加测试覆盖率,并相应地更新文档。 - 错误分类: Clang 的 问题跟踪器 当前有超过 20,000 个未解决的问题,其中许多问题没有被正确标记,不再可重现,需要缩减测试用例,或者需要其他手动交互。我们始终需要帮助进行 错误分类和问题跟踪器维护。
- 提高 Clang 的构建时间: Clang 处理翻译单元所需的时间对于我们的用户来说非常重要;构建时间越短,用户体验越好。改进 Clang 的性能以及找到方法来积极主动地提醒我们何时引入了对构建时间有重大负面影响的更改,将很有帮助。
- 完成对实验性常量表达式解释器的支持: Clang 的生产级常量表达式解释器通过遍历 AST 节点并执行计算来计算常量表达式结果。这没有良好的性能特性,因此我们开始研究 实验性常量表达式解释器,该解释器通过将 AST 转换为字节码来工作,然后解释字节码。这项工作还有很多需要完成的工作,因为它需要为 C++ 和 C 中可以用于常量表达式的每种表达式和类型实现字节码。
- 改进 clang-doc: Clang 的基于库的设计使其可以被各种用于分析源代码的工具使用。 clang-doc 是这种功能的一个很好的应用,它可以从源代码中生成代码文档。该工具处于开发的早期阶段,需要更多专门的努力才能完成实现。
- 使用 clang 进行自我测试: 有几种巧妙的方法可以通过自我测试来提高 clang 的质量。一些例子
- 通过确保 clang 在输入上产生的 AST 在重新解析或反序列化时不会改变,来提高 AST 打印和序列化的可靠性。
- 通过自动或随机更改输入,检查 clang 是否没有崩溃以及对于小的输入更改是否没有生成过多的错误,来提高解析器可靠性和错误生成。在文本和标记级别上操作输入可能会产生有趣的测试用例。
- 继续进行 C++20、C++23、C++2c 和 C23 支持工作: 还有几个 C++20 功能需要完成,并且已经开始支持最新的语言标准。请参阅 C++ 状态报告页面,以了解哪些功能缺失。
- 将 API 字符串化: 一个费力但非常有用的项目是将字符串化(转换为使用llvm::StringRef而不是const char *或std::string) 各种 clang 接口。这通常可以简化代码并提高效率。
- 配置管理器: Clang/LLVM 在大量架构和操作系统上运行,并且可以交叉编译到同样多的配置中,但选择命令行选项、确保选择正确的子架构以及确保特定系统中正确可选元素的存在可能很麻烦。
一个工具可以调查主机和目标,并将配置存储在文件中,然后 Clang 本身可以读取这些文件以避免命令行选项,尤其是与使用哪些目标选项相关的选项,这将大大减轻这个问题。一个简单的工具,对 LLVM 本身的依赖很小或没有依赖,可以通过探测硬件、软件、库以及编译和执行代码来识别所有与命令行选项相关的属性(VFP、SSE、NEON、ARM vs. Thumb 等)、三元组设置等。
第一步是为 Clang 构建一个 CFLAGS,它将生成在当前主机上到已识别目标的代码。
第二步是生成一个配置文件(可以独立于主机使用),以便 Clang 可以读取它,而不需要大量的命令行选项。该文件应该是一个简单的 JSON/INI 或任何文本编辑器可以更改的文件。
如果您在使用 Clang 时遇到错误,缩减演示问题的代码以使其变小对我们非常有用。有很多方法可以做到这一点;在 Discourse、Discord 上寻求建议。