// In the following, we demonstrate how to get the // - Dominator Tree(DT), // - Post-Dominator Tree and // - Control-Dependence Graph // for a given method.importorg.opalj.io.writeAndOpenimportorg.opalj.br._;importorg.opalj.br.analyses._;importorg.opalj.ai._;implicitvalp=Project(newjava.io.File("OPAL/bi/target/scala-2.11/resource_managed/test/controlflow.jar"))// Select a method // HERE, WE DELIBERATELY CHOOSE A METHOD WHICH CONTAINS AN INFINITE LOOP (NOT AN UNBOUNDED ONE...); i.e., valcf=p.classFile(ObjectType("controlflow/InfiniteLoops")).getvalmethodNames=List(// "trivialInfiniteLoop",// "trivialNestedInfiniteLoops",// "regularLoopInInfiniteLoop",// "nestedInfiniteLoops",// "complexPathToInfiniteLoop",// "infiniteLoopWithComplexPath",// "complexPathToInfiniteLoopWithComplexPath","multipleInfiniteLoops")valaiResults=for{methodName<-methodNames}yield{println("processing: "+methodName)valm=cf.findMethod(methodName).head// Perform an intra-procedural, very lightweight abstract interpretation of the method// using a domain which records the CFG (RecordCFG); the most lightweight domain is// the `PrimitiveTACAIDomain`.valr=BaseAI(m,newdomain.l1.DefaultDomainWithCFG(p,m))valbbcfg=r.domain.bbCFGwriteAndOpen(bbcfg.toDot,"BBCFG-"+methodName,".bbcfg.gv")valcfg=r.domain.cfgAsGraphwriteAndOpen(org.opalj.graphs.toDot(List(cfg)),"CFG-"+methodName,".cfg.gv")// Domintator Treevaldt=r.domain.dominatorTreewriteAndOpen(dt.toDot(m.body.get.instructions(_)!=null),"DT-"+methodName,".dt.gv")// (Forward) Dominance Frontiersvaldf=org.opalj.graphs.DominanceFrontiers.apply(dt,r.domain.wasExecuted)writeAndOpen(df.toDot(i=>i>=m.body.get.codeSize||m.body.get.instructions(i)!=null),"DF-"+methodName,".df.gv")// Post Dominator Treevalpdt=r.domain.postDominatorTreewriteAndOpen(pdt.toDot(i=>i>=m.body.get.codeSize||m.body.get.instructions(i)!=null),"PDT-"+methodName,".pdt.gv")r.domain.infiniteLoopHeaders.foreach(println)valcdg=r.domain.controlDependencies// Uses backward dominance frontiersfor(pc<-r.domain.allExecuted){varps:List[Int]=Nilcdg.xIsControlDependentOn(pc)(p=>ps::=p)println(s"$pc is control dependent on ${ps.mkString("{",",","}")}")}r}// Check if some method contains an infinite loopp.allClassFiles.foreach{cf=>cf.methods.filter(_.body.isDefined).foreach{m=>valr=BaseAI(m,newdomain.l1.DefaultDomainWithCFG(p,m));valinfiniteLoops=r.domain.infiniteLoopHeadersprint(if(infiniteLoops.nonEmpty)Console.REDelseConsole.GREEN)println(m.toJava("infinite loops="+infiniteLoops.mkString(", "))+Console.RESET)}}
HTTPSSSH
You can clone a snippet to your computer for local editing.
Learn more.