Static Value-Flow Analysis
Loading...
Searching...
No Matches
AEStat.cpp
Go to the documentation of this file.
1//===- AEStat.cpp -- Statistics for Abstract Execution----------//
2//
3// SVF: Static Value-Flow Analysis
4//
5// Copyright (C) <2013-> <Yulei Sui>
6//
7
8// This program is free software: you can redistribute it and/or modify
9// it under the terms of the GNU Affero General Public License as published by
10// the Free Software Foundation, either version 3 of the License, or
11// (at your option) any later version.
12
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU Affero General Public License for more details.
17
18// You should have received a copy of the GNU Affero General Public License
19// along with this program. If not, see <http://www.gnu.org/licenses/>.
20//
21//===----------------------------------------------------------------------===//
22
23#include "AE/Svfexe/AEStat.h"
25#include "SVFIR/SVFIR.h"
26
27using namespace SVF;
28using namespace SVFUtil;
29
30// count the size of memory map
32{
33 if (count == 0)
34 {
35 generalNumMap["ES_Var_AVG_Num"] = 0;
36 generalNumMap["ES_Loc_AVG_Num"] = 0;
37 generalNumMap["ES_Var_Addr_AVG_Num"] = 0;
38 generalNumMap["ES_Loc_Addr_AVG_Num"] = 0;
39 }
40 ++count;
41}
42
43
45{
47 if (count > 0)
48 {
49 generalNumMap["ES_Var_AVG_Num"] /= count;
50 generalNumMap["ES_Loc_AVG_Num"] /= count;
51 generalNumMap["ES_Var_Addr_AVG_Num"] /= count;
52 generalNumMap["ES_Loc_Addr_AVG_Num"] /= count;
53 }
54 generalNumMap["SVF_STMT_NUM"] = count;
55
57 generalNumMap["ICFG_Node_Num"] = totalICFGNodes;
58
59 // Calculate coverage: use allAnalyzedNodes which tracks all nodes across all entry points
61 generalNumMap["Analyzed_ICFG_Node_Num"] = analyzedNodes;
62
63 // Coverage percentage (stored as integer percentage * 100 for precision)
64 if (totalICFGNodes > 0)
65 {
66 double coveragePercent = (double)analyzedNodes / (double)totalICFGNodes * 100.0;
67 generalNumMap["ICFG_Coverage_Percent"] = (u32_t)(coveragePercent * 100); // Store as percentage * 100
68 }
69 else
70 {
71 generalNumMap["ICFG_Coverage_Percent"] = 0;
72 }
73
78 for (const auto &it: *_ae->svfir->getICFG())
79 {
80 if (it.second->getFun())
81 {
82 funs.insert(it.second->getFun());
83 // Check if this node was analyzed (across all entry points)
84 if (_ae->allAnalyzedNodes.find(it.second) != _ae->allAnalyzedNodes.end())
85 {
86 analyzedFuns.insert(it.second->getFun());
87 }
88 }
90 {
91 if (!isExtCall(callNode))
92 {
94 }
95 else
96 {
98 }
99 }
100 }
101 generalNumMap["Func_Num"] = funs.size();
102 generalNumMap["Analyzed_Func_Num"] = analyzedFuns.size();
103
104 // Function coverage percentage
105 if (funs.size() > 0)
106 {
107 double funcCoveragePercent = (double)analyzedFuns.size() / (double)funs.size() * 100.0;
108 generalNumMap["Func_Coverage_Percent"] = (u32_t)(funcCoveragePercent * 100); // Store as percentage * 100
109 }
110 else
111 {
112 generalNumMap["Func_Coverage_Percent"] = 0;
113 }
114
115 generalNumMap["EXT_CallSite_Num"] = extCallSiteNum;
116 generalNumMap["NonEXT_CallSite_Num"] = callSiteNum;
117 timeStatMap["Total_Time(sec)"] = (double)(endTime - startTime) / TIMEINTERVAL;
118
119}
120
122{
123 std::string fullName(_ae->moduleName);
124 std::string name;
125 std::string moduleName;
126 if (fullName.find('/') == std::string::npos)
127 {
128 std::string name = fullName;
129 moduleName = name.substr(0, fullName.find('.'));
130 }
131 else
132 {
133 std::string name = fullName.substr(fullName.find('/'), fullName.size());
134 moduleName = name.substr(0, fullName.find('.'));
135 }
136
137 SVFUtil::outs() << "\n************************\n";
138 SVFUtil::outs() << "################ (program : " << moduleName << ")###############\n";
139 SVFUtil::outs().flags(std::ios::left);
140 unsigned field_width = 30;
141 for (NUMStatMap::iterator it = generalNumMap.begin(), eit = generalNumMap.end(); it != eit; ++it)
142 {
143 // Special handling for percentage fields (stored as percentage * 100)
144 if (it->first == "ICFG_Coverage_Percent" || it->first == "Func_Coverage_Percent")
145 {
146 double percent = (double)it->second / 100.0;
147 std::cout << std::setw(field_width) << it->first << std::fixed << std::setprecision(2) << percent << "%\n";
148 }
149 else
150 {
151 std::cout << std::setw(field_width) << it->first << it->second << "\n";
152 }
153 }
154 SVFUtil::outs() << "-------------------------------------------------------\n";
155 for (TIMEStatMap::iterator it = timeStatMap.begin(), eit = timeStatMap.end(); it != eit; ++it)
156 {
157 // format out put with width 20 space
158 SVFUtil::outs() << std::setw(field_width) << it->first << it->second << "\n";
159 }
160 SVFUtil::outs() << "Memory usage: " << memUsage << "\n";
161
162 SVFUtil::outs() << "#######################################################" << std::endl;
163 SVFUtil::outs().flush();
164}
#define TIMEINTERVAL
Definition SVFType.h:621
const char *const name
Definition cJSON.h:264
s32_t count
Definition AEStat.h:57
std::string memUsage
Definition AEStat.h:59
void finializeStat()
Definition AEStat.cpp:44
void performStat() override
Definition AEStat.cpp:121
std::string getMemUsage()
Definition AEStat.h:46
void countStateSize()
Definition AEStat.cpp:31
AbstractInterpretation * _ae
Definition AEStat.h:56
SVFIR * svfir
protected data members, also used in subclasses
Set< const ICFGNode * > allAnalyzedNodes
u32_t nodeNum
total num of edge
ICFG * getICFG() const
Definition SVFIR.h:229
NUMStatMap generalNumMap
Definition SVFStat.h:76
std::string moduleName
Definition SVFStat.h:99
TIMEStatMap timeStatMap
Definition SVFStat.h:78
double endTime
Definition SVFStat.h:81
double startTime
Definition SVFStat.h:80
bool isExtCall(const FunObjVar *fun)
Definition SVFUtil.cpp:437
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:52
for isBitcode
Definition BasicTypes.h:70
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76
unsigned u32_t
Definition GeneralType.h:47