最近我一直在使用 ROSE 编译器,并且能够将一些代码插入应用到 C 源代码中并获得成功的输出。但是,我在访问 SgAssignOps 时无法插入赋值语句。这是我的代码的简化版本,用于显示问题:
#include "rose.h"
#include <iostream>
#include <transformationSupport.h>
using namespace SageInterface;
using namespace SageBuilder;
using namespace std;
int main (int argc, char *argv[])
{
SgProject *project = frontend (argc, argv);
// Find all Assignment operations
std::vector<SgNode* > assignOpList = NodeQuery::querySubTree (project, V_SgAssignOp);
std::vector<SgNode*>::iterator iter;
for (iter = assignOpList.begin(); iter!= assignOpList.end(); iter++) {
SgNode * node = (*iter);
SgStatement * asmStmt = TransformationSupport::getStatement(node);
//ADD PRAGMA STATEMENT BEFORE
ostringstream osPragma;
osPragma << "example statement";
SgPragmaDeclaration* pragmaDecl = buildPragmaDeclaration(osPragma.str());
insertStatementBefore(asmStmt, pragmaDecl);
//ADD ASSIGNMENT STATEMENT AFTER
SgExprStatement* newAsmt = buildAssignStatement(buildVarRefExp("a"),buildIntVal(9));
insertStatementAfter(asmStmt,newAsmt);
}
AstTests::runAllTests(project);
// Translation only
project->unparse();
}
一个简单的输入代码:
int main(int argc, char* argv[])
{
int a;
a = 3;
return a;
}
代码编译。然而..
当应用于输入代码时,我得到一个分段错误,没有错误消息。
如果我删除赋值语句插入,则 pragma 插入有效。
如果我删除对 runAllTests() 的调用,我会在解析时收到以下错误消息:
test: /mnt/DATA/rose/src/backend/unparser/nameQualificationSupport.C:4986: virtual NameQualificationInheritedAttribute NameQualificationTraversal::evaluateInheritedAttribute(SgNode*, NameQualificationInheritedAttribute): Assertion `initializedName->get_parent() != __null' failed.
Aborted (core dumped)
注意我在这个例子和输入代码中使用了“a”,所以变量已经被声明了。
进行这样的分配插入的正确方法是什么?
本教程中提供的示例使用主函数体上的范围并将其插入到最后,我需要它在另一个分配之后发生。我需要将节点上的 Scope 推送到 ScopeStack 吗?如果是这样,那将如何表达?我对 push 和 pop 范围堆栈方法不是很熟悉。