4

TL;DR;

callExpr -> arg_0 -> DeclRefExpr から、一定サイズの配列宣言のサイズに使用されるマクロ名を取得する方法。

詳細な問題の説明:

最近、追加の引数を使用して特定の関数呼び出しを変更するためのソースからソースへの変換ツールを必要とする課題に取り組み始めました。私が達成できる方法について再調査すると、この素晴らしいツールセット Clang が紹介されました。libtooling で提供されているさまざまなツールを使用して目標を達成する方法を学んでいます。しかし今、私は問題に行き詰まっています。ここであなたの助けを求めてください.

以下のプログラム (私のソースのダミー) を考慮してください。私の目標は、strcpy_s の安全なバージョンを使用して strcpy 関数へのすべての呼び出しを書き直し、新しい関数呼び出しに追加パラメーター、つまり宛先ポインターの最大サイズを追加することです。したがって、以下のプログラムでは、リファクタリングされた呼び出しは strcpy_s(inStr, STR_MAX, argv[1]); のようになります。

RecursiveVisitor クラスを作成し、VisitCallExpr メソッドですべての関数呼び出しを調べて、最初の引数の VarDecl を取得し、サイズ (ConstArrayType) を取得しようとしている dest 引数の最大サイズを取得します。ソース ファイルは既に前処理されているため、サイズとして 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;
}
4

1 に答える 1