Skip to content

Instantly share code, notes, and snippets.

@tuxology
Last active Apr 7, 2021
Embed
What would you like to do?
Print call-tree in ASCII usig Ocular
// calltree.sc
// -----------
//
// Suchakra Sharma <suchakra@shiftleft.io> (2019)
//
// Prints the complete call-tree with all possible branches starting from the top of the input method. It is recommended to increase
// the max steps per query to a higher number (eg. "config.query.maxStepsPerCallQuery = 1000000L") for better results.
//
// Example Usage:
// ocular> import $file.scripts.calltree
// ocular> calltree.printCallTree("org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parse:void(javax.servlet.http.HttpServletRequest,java.lang.String)")
def printCallTree(callerFullName : String ) {
var dashCount = 0
var lastCallerMethod = callerFullName
var lastDashCount = 0
println(callerFullName)
def findCallee(methodName: String) {
var calleeList = cpg.method.fullNameExact(methodName).callee.whereNot(_.name(".*<operator>.*")).l
var callerNameList = cpg.method.fullNameExact(methodName).caller.fullName.l
if (callerNameList.contains(lastCallerMethod) || (callerNameList.size == 0)) {
dashCount = lastDashCount
} else {
lastDashCount = dashCount
lastCallerMethod = methodName
dashCount += 1
}
calleeList foreach { c =>
print(printDashes(dashCount) + c.fullName + "\n")
findCallee(c.fullName)
}
}
findCallee(lastCallerMethod)
}
def printDashes(count: Int) = {
var tabStr = "|__"
var i = 0
while (i < count) {
tabStr = " " + tabStr
i += 1
}
tabStr
}
@prabhu
Copy link

prabhu commented Apr 7, 2021

var calleeList = cpg.method.fullNameExact(methodName).callee.filterNot(_.name.contains("<operator>")).l

@tuxology
Copy link
Author

tuxology commented Apr 7, 2021

Updated filterNot to whereNot to account for API changes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment