2017-11-11 11 views
0

libclang을 사용하여 함수 호출에 인수를 삽입하는 방법을 알고 싶습니다. 난 그냥 인수를 출력 코드를 다음과 같습니다libclang을 사용하여 코드를 삽입하는 방법 (C++)

class CASTVisitor : public RecursiveASTVisitor<CASTVisitor> 
{ 
public: 
    CASTVisitor(Rewriter &R) : rewriter(R) 
    { 
    } 

    virtual bool VisitCallExpr(CallExpr *call) 
    { 
     for(int i = 0, j = call->getNumArgs(); i < j; ++ i) 
     { 
      errs() << "argType: " << call->getArg(i)->getType().getAsString() << "\n"; 
     } 

     errs() << "** Added parameter to function call\n"; 

     return true; 
    } 
... 
}; 

편집 :

내가 읽고 인수를 설정할 수 있지만, 내가의 시작 부분에 하나를 삽입 할 수있는 방법이 표시되지 않습니다 parmVarDcl() 정규 표현 엔진

기본 클래스 및 복합 문에 멤버 변수를 추가하는 경우도 마찬가지입니다. 기존 텍스트를 바꿀 수 있지만 새 오브젝트를 쉽게 삽입 할 수는없는 것 같습니다. 내가 맞습니까?

+0

또한 "연타는 그 AST의 돌연변이를 지원하도록 설계되지 않았습니다" https://stackoverflow.com/a/10763844/7392560 내가 예상했던 것보다 더 복잡 할 것이다 함수 호출하는 간단한 매개 변수를 추가 생각 . –

답변

0

내가 지금까지 발견 커서에서 파일 포인터를 얻고 수동으로 코드를 주입하는 것입니다 유일한 해결책 : 사람이 더 나은 아이디어가있는 경우

https://github.com/burnflare/libclang-experiments

CXFile file; 
unsigned line; 
unsigned offset; 

clang_getSpellingLocation(clang_getCursorLocation(cursors[i+1]), 
          &file, 
          &line, 
          NULL, 
          &offset); 

const char* filename = clang_getCString(clang_getFileName(file)); 
printf("\n\nMethod found in %s in line %d, offset %d\n", clang_getCString(clang_getFileName(file)), line, offset); 

// File reader 
FILE *fr = fopen(filename, "r"); 
fseek(fr, 0, SEEK_END); 
long fsize = ftell(fr); 
fseek(fr, 0, SEEK_SET); 

// Reading file to string 
char *input = malloc(fsize); 
fread(input, fsize, 1, fr); 
fclose(fr); 

// Making an output that is input(start till offset) + code injection + input(offset till end) 
FILE *fw = fopen(filename, "w"); 
char *output = malloc(fsize); 
strncpy(output, input, offset); 
strcat(output, injectCode); 
strcat(output, input+offset); 

// Rewrite the whole file with output string 
fwrite(output, fsize, sizeof(output), fw); 
fclose(fw); 

그때 알려 주시기 바랍니다!