Clang-Tidy Checker with Transformer
文章目录
Documents
https://clang.llvm.org/docs/LibASTMatchersReference.html
https://clang.llvm.org/extra/clang-tidy/
https://clang.llvm.org/extra/clang-tidy/Contributing.html
https://clang.llvm.org/docs/ClangTransformerTutorial.html
Equal Null
论文 FixReverter 提出了三种 bugfix pattern,尝试用 Clang Transformer 添加 clang-tidy checker 来快速复现,但遇到了一些问题。
比如论文中提到 Abort Pattern,以 binutils 中的 bfd/compress.c 为例,插入了判断指针为 NULL 的 if 语句,但我的 checker 居然无法发现这种简单的 NULL 判断。
但 checker 在我构造的测试程序上表现良好:
#include <cstdio>
#include <cstdlib>
#include <cstring>
struct O {
int x;
char *s;
};
struct M {
int num;
char *name;
O *o;
};
int main() {
const char *s = "hello world";
M *m = (M *)malloc(sizeof(M));
if (m == NULL || m->num == 0 || m->name + 1 == NULL || m->o == NULL) {
return -1;
}
size_t len = strlen(s);
if (s == NULL) {
puts("NULL!!");
return -1;
}
if (strlen(s) > 4) return -1;
else if (sizeof(s) < puts(s)) return 1;
for (int i = 0; i < len; i++) {
if (s[i] == ' ') {
break;
}
}
return 0;
}
以判断 NULL 为例,实现 matcher 的核心代码如下,能在测试程序上正常运行,但对 bfd/compress.c
运行没有任何结果
auto PtrVar = hasType(isAnyPointer());
auto PtrTracer = expr(anyOf(declRefExpr(PtrVar), memberExpr(member(PtrVar))));
auto EqNull = binaryOperator(hasOperatorName("=="), hasOperands(PtrTracer, ignoringImpCasts(nullPointerConstant())));
即使将上述代码复制进 bfd/compress.c
依然无法识别出结果,用 clang-query
亦无法匹配成功。
评论正在加载中...如果评论较长时间无法加载,你可以 搜索对应的 issue 或者 新建一个 issue 。