gpt4 book ai didi

c - 在 AssignOp 之后在 ROSE 编译器中插入赋值

转载 作者:太空狗 更新时间:2023-10-29 15:40:32 26 4
gpt4 key购买 nike

最近我一直在使用 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 作用域堆栈方法。

最佳答案

这是旧的,但可以为将来遇到此问题的人提供答案。

错误实际上是在您调用 buildVarRefExp 和 buildPragmaDeclaration 时产生的。蜜蜂看透doxygen ,它们为 SgScopeStatement 采用一个可选参数。此范围语句是 SageBuilder 查找引用变量 ( github source ) 的地方。 如果没有给出,它会从 ScopeStack 中获取。然而,当您没有将任何东西压入 ScopeStack 并在没有可选参数的情况下调用这些函数时,它不知道去哪里查找。

因此,您的两个解决方案是:

  1. 使用 ScopeStack 存储 SgScopeStatement(例如 pushScopeStack)
  2. 将 SgScopeStatement 作为参数传递给 buildVarRefExp 和 buildPragmaDeclaration。

具体来说,您可以:

SgScopeStatement scope = TransformationSupport::getFunctionDeclaration(node)->get_scope();

并将您的 SageBuilder 语句替换为:

buildPragmaDeclaration(osPragma.str(), scope);
buildVarRefExp("a", scope);

关于c - 在 AssignOp 之后在 ROSE 编译器中插入赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30763773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com