【问题标题】:Howto inject code using libclang (in C++)如何使用 libclang 注入代码(在 C++ 中)
【发布时间】:2017-11-11 01:28:10
【问题描述】:

我想知道如何使用 libclang 将参数插入到函数调用中?我必须遵循只打印参数的代码:

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() 匹配器的开头插入一个。

将成员变量添加到基类和复合语句中也是如此。您似乎可以更改现有文本,但不能轻松插入新对象。我说的对吗?

【问题讨论】:

  • 另外:“Clang 并非旨在支持其 AST 的突变”:stackoverflow.com/a/10763844/7392560 我认为在函数调用中添加一个简单的参数会比我预期的要复杂。

标签: c++ libclang


【解决方案1】:

到目前为止,我发现的唯一解决方案是从光标获取文件指针并手动注入代码:

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);

如果有人有更好的想法,请告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 2012-07-07
    • 1970-01-01
    • 2014-10-06
    • 2010-09-06
    • 2010-11-24
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多