下面这段代码中while里面的空报错,应该怎么填?#include "SVF-LLVM/LLVMUtil.h" #include "SVF-LLVM/SVFIRBuilder.h" #include "WPA/Andersen.h" #include "Assignment-3.h" using namespace SVF; using namespace llvm; using namespace std; // TODO: Implement your Andersen's Algorithm here void AndersenPTA::solveWorklist(){ processAllAddr(); // Keep solving until workList is empty. while (!isWorklistEmpty()) { NodeID nodeId = removeFromWorklist(); if (nodeId != AndersNodeFactory::InvalidIdx) { ConstraintNode *node = getNode(nodeId); if (node != nullptr) { processNode(node); }} } } // Process all address constraints to initialize pointers' points-to sets void AndersenPTA::processAllAddr(){ for (ConstraintGraph::const_iterator nodeIt = consCG->begin(), nodeEit = consCG->end(); nodeIt != nodeEit; nodeIt++) { ConstraintNode *cgNode = nodeIt->second; for (ConstraintEdge* edge : cgNode->getAddrInEdges()) { const AddrCGEdge *addr = SVFUtil::cast<AddrCGEdge>(edge); NodeID dst = addr->getDstID(); NodeID src = addr->getSrcID(); if (addPts(dst, src)) pushIntoWorklist(dst); } } }
时间: 2023-06-27 22:06:33 浏览: 74
你可以尝试在空格中填写一些打印语句,以便在调试时更好地理解程序的行为。例如,你可以在 while 循环中添加以下语句:
```
while (!isWorklistEmpty())
{
NodeID nodeId = removeFromWorklist();
if (nodeId != AndersNodeFactory::InvalidIdx)
{
ConstraintNode *node = getNode(nodeId);
if (node != nullptr)
{
processNode(node);
// print some debugging information
errs() << "Processing node " << nodeId << "\n";
}
}
}
```
这将输出当前处理的节点的 ID,以帮助你更好地理解程序的行为。另外,你还可以添加其他的调试语句,例如打印节点的信息、打印指针的信息等等。
相关问题
如果想让上面这段代码测试通过,下面的while里面应该填什么 下面这段代码中while里面的空应该怎么填? #include "SVF-LLVM/LLVMUtil.h" #include "SVF-LLVM/SVFIRBuilder.h" #include "WPA/Andersen.h" #include "Assignment-3.h" using namespace SVF; using namespace llvm; using namespace std; // TODO: Implement your Andersen's Algorithm here void AndersenPTA::solveWorklist(){ processAllAddr(); // Keep solving until workList is empty. while (!isWorklistEmpty()) { } } // Process all address constraints to initialize pointers' points-to sets void AndersenPTA::processAllAddr(){ for (ConstraintGraph::const_iterator nodeIt = consCG->begin(), nodeEit = consCG->end(); nodeIt != nodeEit; nodeIt++) { ConstraintNode cgNode = nodeIt->second; for (ConstraintEdge edge : cgNode->getAddrInEdges()) { const AddrCGEdge *addr = SVFUtil::cast<AddrCGEdge>(edge); NodeID dst = addr->getDstID(); NodeID src = addr->getSrcID(); if (addPts(dst, src)) pushIntoWorklist(dst); } } }
在while循环中,应该调用worklist算法中的popFromWorklist()方法,从worklist中取出一个节点进行处理,直到worklist为空为止。代码如下:
```
void AndersenPTA::solveWorklist(){
processAllAddr();
// Keep solving until workList is empty.
while (!isWorklistEmpty()) {
NodeID node = popFromWorklist();
processNode(node);
}
}
```
其中,processNode()方法是处理一个节点的函数,需要在之后实现。
这段代码是上一段代码的测试代码 需要输出成功 #include "Assignment-3.h" #include "SVF-LLVM/LLVMUtil.h" #include "SVF-LLVM/SVFIRBuilder.h" #include "WPA/Andersen.h" #include "Util/Options.h" #include "Util/CommandLine.h" void Test1() { SVF::SVFModule *svfModule = SVF::LLVMModuleSet::getLLVMModuleSet()->buildSVFModule({"./Assignment-3/testcase/bc/no_alias.ll"}); /// Build Program Assignment Graph (SVFIR) SVF::SVFIRBuilder builder(svfModule); SVF::SVFIR *pag = builder.build(); pag->dump ("./Assignment-3/testcase/dot/no_alias_init"); AndersenPTA *andersenPTA = new AndersenPTA(pag); andersenPTA->analyze(); andersenPTA->dump_consCG("./Assignment-3/testcase/dot/no_alias_final"); delete andersenPTA; SVF::LLVMModuleSet::releaseLLVMModuleSet(); SVF::SVFIR::releaseSVFIR(); } void Test2() { SVF::SVFModule *svfModule = SVF::LLVMModuleSet::getLLVMModuleSet()->buildSVFModule({"./Assignment-3/testcase/bc/CI-global.ll"}); /// Build Program Assignment Graph (SVFIR) SVF::SVFIRBuilder builder(svfModule); SVF::SVFIR *pag = builder.build(); pag->dump ("./Assignment-3/testcase/dot/CI-global_init"); AndersenPTA *andersenPTA = new AndersenPTA(pag); andersenPTA->analyze(); andersenPTA->dump_consCG("./Assignment-3/testcase/dot/CI-global_final"); delete andersenPTA; SVF::SVFIR::releaseSVFIR(); SVF::LLVMModuleSet::releaseLLVMModuleSet(); } void Test3() { SVF::SVFModule *svfModule = SVF::LLVMModuleSet::getLLVMModuleSet()->buildSVFModule({"./Assignment-3/testcase/bc/CI-local.ll"}); /// Build Program Assignment Graph (SVFIR) SVF::SVFIRBuilder builder(svfModule); SVF::SVFIR *pag = builder.build(); pag->dump ("./Assignment-3/testcase/dot/CI-local_init"); AndersenPTA *andersenPTA = new AndersenPTA(pag); andersenPTA->analyze(); andersenPTA->dump_consCG("./Assignment-3/testcase/dot/CI-local_final"); SVF::LLVMModuleSet::releaseLLVMModuleSet(); SVF::SVFIR::releaseSVFIR(); delete andersenPTA; } void Test() { Test1(); Test2(); Test3(); } int main(int argc, char ** argv) { int arg_num = 0; int extraArgc = 1; char **arg_value = new char [argc + extraArgc]; for (; arg_num < argc; ++arg_num) { arg_value[arg_num] = argv[arg_num]; } // You may comment it to see the details of the analysis arg_value[arg_num++] = (char) "-stat=false"; std::vectorstd::string moduleNameVec; moduleNameVec = OptionBase::parseOptions( arg_num, arg_value, "Teaching-Software-Analysis Assignment 3", "[options]" ); Test(); return 0; }
这段代码看起来像是进行了对于一个软件的分析,主要是使用了SVF和Andersen PTA这两个工具来进行分析。其中的Test1、Test2、Test3函数分别对应了三个不同的测试用例,分别是no_alias.ll、CI-global.ll和CI-local.ll。在main函数中,还进行了一些参数的处理,并调用了Test函数进行测试。如果代码运行成功,应该会输出一些结果。