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