TL;DR;
Как получить имя макроса, используемое для размера объявления массива постоянного размера, из callExpr -> arg_0 -> DeclRefExpr.
Подробное описание проблемы:
Недавно я начал работать над задачей, которая требует инструмента преобразования исходного кода для изменения вызовов определенных функций с дополнительным аргументом. Изучение способов, которыми я могу достичь, познакомило меня с этим удивительным набором инструментов Clang. Я научился использовать различные инструменты, предоставленные в libtooling, для достижения своей цели. Но теперь я застрял в проблеме, обратитесь за помощью сюда.
Рассмотрим приведенную ниже программу (фиктивную из моих источников), моя цель - переписать все вызовы функции strcpy с помощью безопасной версии strcpy_s и добавить дополнительный параметр в новый вызов функции, то есть - максимальный размер указателя назначения. поэтому для приведенной ниже программы мой рефакторинговый вызов будет выглядеть как strcpy_s(inStr, STR_MAX, argv[1]);
Я написал класс RecursiveVisitor и проверил все вызовы функций в методе VisitCallExpr, чтобы получить максимальный размер аргумента назначения, я получаю 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;
}