1*67e74705SXin Li#!/usr/bin/env python 2*67e74705SXin Li 3*67e74705SXin Li""" 4*67e74705SXin LiScript to Summarize statistics in the scan-build output. 5*67e74705SXin Li 6*67e74705SXin LiStatistics are enabled by passing '-internal-stats' option to scan-build 7*67e74705SXin Li(or '-analyzer-stats' to the analyzer). 8*67e74705SXin Li 9*67e74705SXin Li""" 10*67e74705SXin Li 11*67e74705SXin Liimport string 12*67e74705SXin Lifrom operator import itemgetter 13*67e74705SXin Liimport sys 14*67e74705SXin Li 15*67e74705SXin Liif __name__ == '__main__': 16*67e74705SXin Li if len(sys.argv) < 2: 17*67e74705SXin Li print >> sys.stderr, 'Usage: ', sys.argv[0],\ 18*67e74705SXin Li 'scan_build_output_file' 19*67e74705SXin Li sys.exit(-1) 20*67e74705SXin Li 21*67e74705SXin Li f = open(sys.argv[1], 'r') 22*67e74705SXin Li Time = 0.0 23*67e74705SXin Li TotalTime = 0.0 24*67e74705SXin Li MaxTime = 0.0 25*67e74705SXin Li Warnings = 0 26*67e74705SXin Li Count = 0 27*67e74705SXin Li FunctionsAnalyzed = 0 28*67e74705SXin Li ReachableBlocks = 0 29*67e74705SXin Li ReachedMaxSteps = 0 30*67e74705SXin Li NumSteps = 0 31*67e74705SXin Li NumInlinedCallSites = 0 32*67e74705SXin Li NumBifurcatedCallSites = 0 33*67e74705SXin Li MaxCFGSize = 0 34*67e74705SXin Li Mode = 1 35*67e74705SXin Li for line in f: 36*67e74705SXin Li if ("Miscellaneous Ungrouped Timers" in line) : 37*67e74705SXin Li Mode = 1 38*67e74705SXin Li if (("Analyzer Total Time" in line) and (Mode == 1)) : 39*67e74705SXin Li s = line.split() 40*67e74705SXin Li Time = Time + float(s[6]) 41*67e74705SXin Li Count = Count + 1 42*67e74705SXin Li if (float(s[6]) > MaxTime) : 43*67e74705SXin Li MaxTime = float(s[6]) 44*67e74705SXin Li if ((("warning generated." in line) or ("warnings generated" in line)) and Mode == 1) : 45*67e74705SXin Li s = line.split() 46*67e74705SXin Li Warnings = Warnings + int(s[0]) 47*67e74705SXin Li if (("The # of functions analysed (as top level)" in line) and (Mode == 1)) : 48*67e74705SXin Li s = line.split() 49*67e74705SXin Li FunctionsAnalyzed = FunctionsAnalyzed + int(s[0]) 50*67e74705SXin Li if (("The % of reachable basic blocks" in line) and (Mode == 1)) : 51*67e74705SXin Li s = line.split() 52*67e74705SXin Li ReachableBlocks = ReachableBlocks + int(s[0]) 53*67e74705SXin Li if (("The # of times we reached the max number of steps" in line) and (Mode == 1)) : 54*67e74705SXin Li s = line.split() 55*67e74705SXin Li ReachedMaxSteps = ReachedMaxSteps + int(s[0]) 56*67e74705SXin Li if (("The maximum number of basic blocks in a function" in line) and (Mode == 1)) : 57*67e74705SXin Li s = line.split() 58*67e74705SXin Li if (MaxCFGSize < int(s[0])) : 59*67e74705SXin Li MaxCFGSize = int(s[0]) 60*67e74705SXin Li if (("The # of steps executed" in line) and (Mode == 1)) : 61*67e74705SXin Li s = line.split() 62*67e74705SXin Li NumSteps = NumSteps + int(s[0]) 63*67e74705SXin Li if (("The # of times we inlined a call" in line) and (Mode == 1)) : 64*67e74705SXin Li s = line.split() 65*67e74705SXin Li NumInlinedCallSites = NumInlinedCallSites + int(s[0]) 66*67e74705SXin Li if (("The # of times we split the path due to imprecise dynamic dispatch info" in line) and (Mode == 1)) : 67*67e74705SXin Li s = line.split() 68*67e74705SXin Li NumBifurcatedCallSites = NumBifurcatedCallSites + int(s[0]) 69*67e74705SXin Li if ((") Total" in line) and (Mode == 1)) : 70*67e74705SXin Li s = line.split() 71*67e74705SXin Li TotalTime = TotalTime + float(s[6]) 72*67e74705SXin Li 73*67e74705SXin Li print "TU Count %d" % (Count) 74*67e74705SXin Li print "Time %f" % (Time) 75*67e74705SXin Li print "Warnings %d" % (Warnings) 76*67e74705SXin Li print "Functions Analyzed %d" % (FunctionsAnalyzed) 77*67e74705SXin Li print "Reachable Blocks %d" % (ReachableBlocks) 78*67e74705SXin Li print "Reached Max Steps %d" % (ReachedMaxSteps) 79*67e74705SXin Li print "Number of Steps %d" % (NumSteps) 80*67e74705SXin Li print "Number of Inlined calls %d (bifurcated %d)" % (NumInlinedCallSites, NumBifurcatedCallSites) 81*67e74705SXin Li print "MaxTime %f" % (MaxTime) 82*67e74705SXin Li print "TotalTime %f" % (TotalTime) 83*67e74705SXin Li print "Max CFG Size %d" % (MaxCFGSize) 84