【发布时间】:2019-10-24 00:11:03
【问题描述】:
TL;DR;
如何从 callExpr -> arg_0 -> DeclRefExpr 中获取用于常量大小数组声明大小的宏名称。
详细问题说明:
最近我开始研究一个需要源到源转换工具来修改的挑战 带有附加参数的特定函数调用。研究我可以实现的方法介绍了我 到这个惊人的工具集 Clang。我一直在学习如何使用 libtooling 中提供的不同工具 实现我的目标。但是现在我遇到了一个问题,请在这里寻求您的帮助。
考虑下面的程序(我的源代码的虚拟),我的目标是重写所有对 strcpy 的调用 具有安全版本的 strcpy_s 的函数,并在新函数调用中添加附加参数 即 - 目标指针最大大小。所以,对于下面的程序,我重构的调用就像 strcpy_s(inStr, STR_MAX, argv[1]);
我编写了一个 RecursiveVisitor 类并检查了 VisitCallExpr 方法中的所有函数调用,以获得最大大小 dest arg 我得到了第一个 agrument 的 VarDecl 并试图获取大小(ConstArrayType)。自从 源文件已经过预处理,我看到 2049 的大小,但我需要的是宏 STR_MAX 这个案例。我怎么能得到那个? (使用此信息创建替换,然后使用 RefactoringTool 替换它们)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STR_MAX 2049
int main(int argc, char **argv){
char inStr[STR_MAX];
if(argc>1){
//Clang tool required to transaform the below call into strncpy_s(inStr, STR_MAX, argv[1], strlen(argv[1]));
strcpy(inStr, argv[1]);
} else {
printf("\n not enough args");
return -1;
}
printf("got [%s]", inStr);
return 0;
}
【问题讨论】:
标签: clang clang++ llvm-clang clang-static-analyzer libtooling