RSSThe plan fell off.

Mitchell's Homepage considered harmful

LLVM 贡献记录

这个文档用来记录我的 LLVM 贡献记录和笔记,大概没什么用,主要是自己看。

本文档是活的文档,会随着我自己的工作进展而更新内容,且不保证已有内容的正确性。

Clang-tidy

cert 重构

学到了有关 Clang-tidy Checks 的取名方式:

we never used "dont" in check name (thought we can use verbs like "avoid" (avoid-goto etc..))

avoid is used when check category is generic like "cppcoreguidelines" or "readabilty". "bugprone" category means by default that we should avoid some language construct.

Check Fixes

学到了关于代码风格的知识:

Clang 的代码库要求贡献者尽可能为变量加上 const

更完整的代码规范在 官网上,不过太长了还没读完。

我 C++ 水平实在是有点次,该读书了。

同时在 Review 过程中,@vbvictor 给了一个我写代码时没想到的 false-positive: link,已严肃学习。

以及 TK_IgnoreUnlessSpelledInSourceTK_AsIs 的区别是,前者会忽略编译器隐式生成的节点 (e.g. 默认构造函数、隐式转换),后者则不会对 AST 做任何过滤。

学习了怎么给 Clang-tidy 的 Check 添加 Option,以后要改/实现类似功能的时候直接翻这个 PR 作参考就行。

LLVM 的 Regex 库真的很好用,本来以为这个 Issue 会修很久,结果一个小时就写完了,接下来就是和 Reviewer 对线,好文明。

2025/11/17 Update:

社区的沟通似乎出现了一些 telemiscommunication, @lakshsidhu04 先前接了这个 Issue 后因为自己的时间问题被 Unassign 了,最后我看没人干就把它做了,但他的 PR 也是开着的,造成了一些 Reviewing 上的阻碍,不过问题不大。

2025/11/19 Update:

感谢 @zwuis (似乎是南科佬?) 的反复提醒,以后要注意 std 库的规范使用。

似乎 Ready to merge :) 合了

比较难绷的是在 clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.h 里有一段神级代码:

static ExceptionInfo createNonThrowing() { return {State::Throwing}; }

有一种左右脑互博的美,遂直接开始对线,不过还没有人回复,静侯结果。

2025/11/19 Update:

我又忘记要 Early return 了,看来必须要为 LLM Reviewer 写 Prompt 了,不然以后天天修代码规范就老实了。

2025/11/28 Update:

文档风格又出问题,不过其它文档也干了,所以我顺手又水了一个 PR

2025/12/9 Update:

修完了没有人 Review, 🌿

崩溃的原因是 FormatStringConverter::appendFormatText 里用了 signed chars,遇到非 ASCII 字符时就变成负数走到控制字符的路径了,传到 llvm::hexdigit直接 OOB 然后 Crash. 问题简单到没开 GDB 光读代码就理解了。

然后找 Bug 加修 Bug 一共半小时,尝试让 Windows 过 CI 测试花了三天还没修出来,原因是 LLVM 的 Windows CI 不知道 UTF-8 是什么,只认自己的编码逻辑,导致测试点里写 UTF-8 字符直接挂。

这 Windows 怎么 NMD 这么创啊

把能用的不能用的方法都试了一遍,还是过不了,人麻了。

2025/11/26 Update:

开摆了,直接在 Windows 上跳过测试了, We are so done.

2025/11/28 Update:

复活!@localspook 提醒了我可以直接指定 python 脚本的输出编码,果然让 Windows CI 过了! We are so back.

以及进行一些善意引导,我感觉它之前过不了 + 很难复现可能和这个 RFC 有关系,它不会现在还在用 Vista 吧,草。

一个没什么营养的 PR.

Zealot 正好抓到了这个 Issue 的更新,顺手修了。

以及感叹 LLVM 里面对 Comments 的处理实在不太友好, 注释解析居然是交给 Checks 自己的? 导致在 Apply Fixes 时很容易就覆盖掉已有的注释.

比较理想的情况是有专门整一套工具来处理注释问题, 不过可惜没有.

在翻 Issue 列表时发现的陈年老问题, 修起来居然比想象中简单, 因为 Check 里的代码逻辑没问题, 出差错的是 ExprMutationAnalyzer.

加一起有效代码只有四行, 闹麻了.

Clang 的神人参数处理:

CommandLine.cpp treats single quote as literal characters on Windows, so the argument is parsed as a check named ' -*,llvm-namespace-comment ', which matches no existing checks, so no checks are enabled via the command line.

Previously, the test passed because it fell back to the root .clang-tidy configuration which enables llvm-*.

真无敌了, 查这个问题查到头晕结果原因是这个.

代码重构是大型项目维护不得不品的一环, 这个拖了很久是因为我的电脑跑 clang-tidy 实在太慢了, 周末一定要做完.

所以修了, 修的时候发现它甚至没法在 C99 上跑, 所以又加上了 C99 的支持.

唯一的问题是没人 Review.

CI 改进

Clang-tidy 在尝试为文档加更多的检查 (句末空格/缺换行/80字限制等),这一系列的工作记录在 #165999

所以分成两个部分,一方面是 CI 的具体实现,另一方面是已有文档的修复。

Doc Fixes

此为写 Python 脚本后白送的免费 PR,不可不水。

以及 LLVM 会把一些没什么用的修改加到 .git-blame-ignore-revs 里,这样 git blame 的时候就可以用 --ignore-rev 忽略它们,我之前没有听说过这个技巧 (每日一个 git 小知识了属于是)。

2025/11/19 Update:

这个文件上的 Commits 是按照时间排序的,下次改要注意不要弄错顺序,往文档末尾加。

没什么营养的文档修复,之前对线的时候发现的,顺手的事。

由于我自己帮别人做 Code Review 时不严谨导致一些不那么好的文档被合并了, 自己引入的问题自己修.

检测脚本

2025/11/15 Update:

@vbvictor 和 @LegalizeAdulthood 回复了,目前差不多确定了这个 RFC 的实现方式:在 LLVM 官网上加一段话(

不过最近没太多时间忙这个,现在当务之急是学 LLVM CI Container 是怎么写的。

2025/11/19 Update:

先 Close 了,有空再看。

通过这个 PR 我才知道 LLVM 的 Python 脚本必须为 3.8 提供支持 (然而这个版本已经 EOL 了),离了个大谱。

搜了下论坛,发现时不时就有人吵要不要把 Python 版本拉高,例如 Upgrading LLVM’s minimum required Python versionRFC: adopt regularly scheduled Python minimum version bumps,好消息是最近他们吵完了,决定拉到 3.10 了,从已经 EOL 到明年 EOL,明年的架明年再吵 (什么猴子马戏团)

2025/11/19 Update:

这个脚本找出了我自己引入的问题,融入马戏团了属于是。

以及由于我不知道怎么写 Python 代码导致整出了 Tuple[List[str], List[Tuple[str, List[str]]], List[str]] 这种逆天活,从 Review Messages 里学到了用 NamedTuple@dataclass,我唐完了。

2025/11/26 Update:

Approve 了,再等一个 Reviewer Approve 后就可以 Merge 了。

2025/12/09 Update:

Merged :)

尝试把 doc8 集成到 LLVM 的 CI 里,一边和 Gemini 吵架一边写代码,开了 PR 以后悲剧地发现 Premerge CI 里不会触发新的 Dockerfile 构建,为了先证明这玩意能跑,于是写出了以下逆天内容:


      - name: Install linter dependencies
        run: |
          pip install doc8 --break-system-packages
          echo "$HOME/.local/bin" >> $GITHUB_PATH

可怕吗,是的很可怕

事实证明这玩意确实能跑:


./clang-tools-extra/docs/clang-tidy/checks/bugprone/unsafe-functions.rst:99: D001 Line too long
./clang-tools-extra/docs/clang-tidy/checks/bugprone/unsafe-functions.rst:100: D001 Line too long
./clang-tools-extra/docs/clang-tidy/checks/bugprone/unsafe-functions.rst:105: D001 Line too long
./clang-tools-extra/docs/clang-tidy/checks/bugprone/unsafe-functions.rst:106: D001 Line too long
./clang-tools-extra/docs/clang-tidy/checks/bugprone/unsafe-functions.rst:107: D001 Line too long
./clang-tools-extra/docs/clang-tidy/checks/bugprone/unsafe-functions.rst:111: D001 Line too long
./clang-tools-extra/docs/clang-tidy/checks/bugprone/unsafe-functions.rst:112: D001 Line too long
./clang-tools-extra/docs/clang-tidy/checks/bugprone/unsafe-functions.rst:126: D001 Line too long

接下来大概是等 @vbvictor 回复,然后把 git diff 也集成进 doc8 的测试,这样就不用每次都检测所有文件了。

2025/11/28 Update:

由于我不会写 Python 导致这个 PATCH 变成了臭不可闻的依托,拼尽全力拆成了两半准备分两次 Review

我这辈子再也不想写 Python 了。

2025/12/09 Update:

原来分两次是分两个 PR 的意思... 前半部分 Merged, 后半部分等我做好心理准备再写.

Issues

没复现出来,但告诉了开 Issue 的人可以用 -extra-arg=-v,放两天看看有没有进展。

2025/11/27 Update:

复现了,看上去是因为 -Wno-format-security-Wformat 的顺序错了,先 -Wno-format...-Wformat 会重新打开 security warnings,再加上一个 -Werror 直接变 Warning 炸掉

2025/11/28 Update:

不对,还有反转。怎么 build 情况不报错啊。

现在猜测是用户编译拿的是 gcc,因为 GNU 神人班不管什么参数顺序,关了就是关了,所以没 Warning,但 Clang-tidy 底下还是 Clang,所以有 Warning

考虑了几个很常见的控制/信息流相关的情况,感觉 Clang Tidy 其实不太好做这个 Check (AST 信息很有限)

@vbvictor 提到了一个 PR 实现了相关的一部分逻辑,一看 + 1246 -0 立刻失去了 Review 的动力,等我做好心理准备再去看。

复现不出来,人也不回复,就这样吧。

Code Reviewing

我从 2025/12/06 开始进行 Code Review 工作

Clang Static Analyzer

目前只修了一个文档问题,是改 Clang-tidy 那里时发现的:

@NagyDonat 很贴心地补充了 CSA 中这些 Check 的历史背景:

By the way, note that these security.insecureAPI checkers are "out of place" in the analyzer. These were developed a long time ago and they are "grandfathered in" because they are used by the users, but freshly developed simple AST-based checks like this would belong to Clang-Tidy — which is a more lightweight tool and is more accessible for the users. However, this doesn't detract from the value of this documentation patch — documentation is equally valuable for all checkers that we provide.

Clang

投喂可爱 Clang 前端,之前它会输出像 [22/18] 这样的诡异计数,在经过我的修复后,变成了这个更诡异的样子:


[1/9] Processing file ...
[2/9] (1/2) Processing file ...
[2/9] (2/2) Processing file ...
[3/9] Processing file ...
[4/9] Processing file ...

有点闹麻,也不知道能不能合进去。

2025/12/9 Update:

这个 PR 现在处于一个我做完了但没有人愿意 Review 的阶段, 何意味啊

尝试为 Clang 的新 constexpr 虚拟机和 Legacy 解释器添加一些向量指令的支持,不过还没做完

做完再写。

2025/12/9 Update:

咕咕咕