svf-lib 1.0.2318 → 1.0.2319

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/package.json +1 -1
  2. package/SVF-osx/Release-build/bin/ae +0 -0
  3. package/SVF-osx/Release-build/bin/cfl +0 -0
  4. package/SVF-osx/Release-build/bin/dvf +0 -0
  5. package/SVF-osx/Release-build/bin/llvm2svf +0 -0
  6. package/SVF-osx/Release-build/bin/mta +0 -0
  7. package/SVF-osx/Release-build/bin/saber +0 -0
  8. package/SVF-osx/Release-build/bin/svf-ex +0 -0
  9. package/SVF-osx/Release-build/bin/wpa +0 -0
  10. package/SVF-osx/Release-build/include/AE/Core/AbstractState.h +0 -425
  11. package/SVF-osx/Release-build/include/AE/Core/AbstractValue.h +0 -157
  12. package/SVF-osx/Release-build/include/AE/Core/AddressValue.h +0 -225
  13. package/SVF-osx/Release-build/include/AE/Core/ICFGWTO.h +0 -135
  14. package/SVF-osx/Release-build/include/AE/Core/IntervalValue.h +0 -1055
  15. package/SVF-osx/Release-build/include/AE/Core/NumericValue.h +0 -1292
  16. package/SVF-osx/Release-build/include/AE/Core/RelExeState.h +0 -226
  17. package/SVF-osx/Release-build/include/AE/Core/RelationSolver.h +0 -91
  18. package/SVF-osx/Release-build/include/AE/Svfexe/AEDetector.h +0 -439
  19. package/SVF-osx/Release-build/include/AE/Svfexe/AbsExtAPI.h +0 -138
  20. package/SVF-osx/Release-build/include/AE/Svfexe/AbstractInterpretation.h +0 -384
  21. package/SVF-osx/Release-build/include/CFL/CFGNormalizer.h +0 -84
  22. package/SVF-osx/Release-build/include/CFL/CFGrammar.h +0 -468
  23. package/SVF-osx/Release-build/include/CFL/CFLAlias.h +0 -168
  24. package/SVF-osx/Release-build/include/CFL/CFLBase.h +0 -118
  25. package/SVF-osx/Release-build/include/CFL/CFLGramGraphChecker.h +0 -74
  26. package/SVF-osx/Release-build/include/CFL/CFLGraphBuilder.h +0 -168
  27. package/SVF-osx/Release-build/include/CFL/CFLSVFGBuilder.h +0 -58
  28. package/SVF-osx/Release-build/include/CFL/CFLSolver.h +0 -374
  29. package/SVF-osx/Release-build/include/CFL/CFLStat.h +0 -67
  30. package/SVF-osx/Release-build/include/CFL/CFLVF.h +0 -68
  31. package/SVF-osx/Release-build/include/CFL/GrammarBuilder.h +0 -100
  32. package/SVF-osx/Release-build/include/CFL/grammar/PAGGrammar.txt +0 -15
  33. package/SVF-osx/Release-build/include/CFL/grammar/PEGGrammar.txt +0 -11
  34. package/SVF-osx/Release-build/include/CFL/grammar/VFGGrammar.txt +0 -7
  35. package/SVF-osx/Release-build/include/DDA/ContextDDA.h +0 -230
  36. package/SVF-osx/Release-build/include/DDA/DDAClient.h +0 -163
  37. package/SVF-osx/Release-build/include/DDA/DDAPass.h +0 -102
  38. package/SVF-osx/Release-build/include/DDA/DDAStat.h +0 -121
  39. package/SVF-osx/Release-build/include/DDA/DDAVFSolver.h +0 -794
  40. package/SVF-osx/Release-build/include/DDA/FlowDDA.h +0 -178
  41. package/SVF-osx/Release-build/include/FastCluster/LICENSE.TXT +0 -13
  42. package/SVF-osx/Release-build/include/FastCluster/fastcluster.h +0 -80
  43. package/SVF-osx/Release-build/include/Graphs/BasicBlockG.h +0 -318
  44. package/SVF-osx/Release-build/include/Graphs/CDG.h +0 -482
  45. package/SVF-osx/Release-build/include/Graphs/CFLGraph.h +0 -232
  46. package/SVF-osx/Release-build/include/Graphs/CHG.h +0 -368
  47. package/SVF-osx/Release-build/include/Graphs/CallGraph.h +0 -497
  48. package/SVF-osx/Release-build/include/Graphs/ConsG.h +0 -402
  49. package/SVF-osx/Release-build/include/Graphs/ConsGEdge.h +0 -355
  50. package/SVF-osx/Release-build/include/Graphs/ConsGNode.h +0 -418
  51. package/SVF-osx/Release-build/include/Graphs/DOTGraphTraits.h +0 -188
  52. package/SVF-osx/Release-build/include/Graphs/GenericGraph.h +0 -628
  53. package/SVF-osx/Release-build/include/Graphs/GraphPrinter.h +0 -111
  54. package/SVF-osx/Release-build/include/Graphs/GraphTraits.h +0 -150
  55. package/SVF-osx/Release-build/include/Graphs/GraphWriter.h +0 -380
  56. package/SVF-osx/Release-build/include/Graphs/ICFG.h +0 -331
  57. package/SVF-osx/Release-build/include/Graphs/ICFGEdge.h +0 -281
  58. package/SVF-osx/Release-build/include/Graphs/ICFGNode.h +0 -669
  59. package/SVF-osx/Release-build/include/Graphs/ICFGStat.h +0 -164
  60. package/SVF-osx/Release-build/include/Graphs/IRGraph.h +0 -398
  61. package/SVF-osx/Release-build/include/Graphs/SCC.h +0 -375
  62. package/SVF-osx/Release-build/include/Graphs/SVFG.h +0 -491
  63. package/SVF-osx/Release-build/include/Graphs/SVFGEdge.h +0 -237
  64. package/SVF-osx/Release-build/include/Graphs/SVFGNode.h +0 -501
  65. package/SVF-osx/Release-build/include/Graphs/SVFGOPT.h +0 -372
  66. package/SVF-osx/Release-build/include/Graphs/SVFGStat.h +0 -273
  67. package/SVF-osx/Release-build/include/Graphs/ThreadCallGraph.h +0 -399
  68. package/SVF-osx/Release-build/include/Graphs/VFG.h +0 -726
  69. package/SVF-osx/Release-build/include/Graphs/VFGEdge.h +0 -295
  70. package/SVF-osx/Release-build/include/Graphs/VFGNode.h +0 -1266
  71. package/SVF-osx/Release-build/include/Graphs/WTO.h +0 -872
  72. package/SVF-osx/Release-build/include/MSSA/MSSAMuChi.h +0 -722
  73. package/SVF-osx/Release-build/include/MSSA/MemPartition.h +0 -169
  74. package/SVF-osx/Release-build/include/MSSA/MemRegion.h +0 -489
  75. package/SVF-osx/Release-build/include/MSSA/MemSSA.h +0 -452
  76. package/SVF-osx/Release-build/include/MSSA/SVFGBuilder.h +0 -104
  77. package/SVF-osx/Release-build/include/MTA/LockAnalysis.h +0 -533
  78. package/SVF-osx/Release-build/include/MTA/MHP.h +0 -546
  79. package/SVF-osx/Release-build/include/MTA/MTA.h +0 -97
  80. package/SVF-osx/Release-build/include/MTA/MTAStat.h +0 -73
  81. package/SVF-osx/Release-build/include/MTA/TCT.h +0 -620
  82. package/SVF-osx/Release-build/include/MemoryModel/AbstractPointsToDS.h +0 -316
  83. package/SVF-osx/Release-build/include/MemoryModel/AccessPath.h +0 -194
  84. package/SVF-osx/Release-build/include/MemoryModel/ConditionalPT.h +0 -878
  85. package/SVF-osx/Release-build/include/MemoryModel/MutablePointsToDS.h +0 -1025
  86. package/SVF-osx/Release-build/include/MemoryModel/PersistentPointsToCache.h +0 -463
  87. package/SVF-osx/Release-build/include/MemoryModel/PersistentPointsToDS.h +0 -955
  88. package/SVF-osx/Release-build/include/MemoryModel/PointerAnalysis.h +0 -428
  89. package/SVF-osx/Release-build/include/MemoryModel/PointerAnalysisImpl.h +0 -602
  90. package/SVF-osx/Release-build/include/MemoryModel/PointsTo.h +0 -255
  91. package/SVF-osx/Release-build/include/MemoryModel/SVFLoop.h +0 -167
  92. package/SVF-osx/Release-build/include/SABER/DoubleFreeChecker.h +0 -76
  93. package/SVF-osx/Release-build/include/SABER/FileChecker.h +0 -80
  94. package/SVF-osx/Release-build/include/SABER/LeakChecker.h +0 -122
  95. package/SVF-osx/Release-build/include/SABER/ProgSlice.h +0 -327
  96. package/SVF-osx/Release-build/include/SABER/SaberCheckerAPI.h +0 -151
  97. package/SVF-osx/Release-build/include/SABER/SaberCondAllocator.h +0 -317
  98. package/SVF-osx/Release-build/include/SABER/SaberSVFGBuilder.h +0 -114
  99. package/SVF-osx/Release-build/include/SABER/SrcSnkDDA.h +0 -327
  100. package/SVF-osx/Release-build/include/SABER/SrcSnkSolver.h +0 -186
  101. package/SVF-osx/Release-build/include/SVF/Util/config.h +0 -46
  102. package/SVF-osx/Release-build/include/SVF-LLVM/BasicTypes.h +0 -280
  103. package/SVF-osx/Release-build/include/SVF-LLVM/BreakConstantExpr.h +0 -93
  104. package/SVF-osx/Release-build/include/SVF-LLVM/CHGBuilder.h +0 -78
  105. package/SVF-osx/Release-build/include/SVF-LLVM/CppUtil.h +0 -184
  106. package/SVF-osx/Release-build/include/SVF-LLVM/DCHG.h +0 -474
  107. package/SVF-osx/Release-build/include/SVF-LLVM/GEPTypeBridgeIterator.h +0 -183
  108. package/SVF-osx/Release-build/include/SVF-LLVM/ICFGBuilder.h +0 -160
  109. package/SVF-osx/Release-build/include/SVF-LLVM/LLVMLoopAnalysis.h +0 -60
  110. package/SVF-osx/Release-build/include/SVF-LLVM/LLVMModule.h +0 -527
  111. package/SVF-osx/Release-build/include/SVF-LLVM/LLVMUtil.h +0 -433
  112. package/SVF-osx/Release-build/include/SVF-LLVM/ObjTypeInference.h +0 -129
  113. package/SVF-osx/Release-build/include/SVF-LLVM/SVFIRBuilder.h +0 -523
  114. package/SVF-osx/Release-build/include/SVF-LLVM/SymbolTableBuilder.h +0 -132
  115. package/SVF-osx/Release-build/include/SVFIR/ObjTypeInfo.h +0 -224
  116. package/SVF-osx/Release-build/include/SVFIR/PAGBuilderFromFile.h +0 -80
  117. package/SVF-osx/Release-build/include/SVFIR/SVFIR.h +0 -856
  118. package/SVF-osx/Release-build/include/SVFIR/SVFStatements.h +0 -1330
  119. package/SVF-osx/Release-build/include/SVFIR/SVFType.h +0 -606
  120. package/SVF-osx/Release-build/include/SVFIR/SVFValue.h +0 -338
  121. package/SVF-osx/Release-build/include/SVFIR/SVFVariables.h +0 -2212
  122. package/SVF-osx/Release-build/include/Util/Annotator.h +0 -180
  123. package/SVF-osx/Release-build/include/Util/BitVector.h +0 -55
  124. package/SVF-osx/Release-build/include/Util/CDGBuilder.h +0 -107
  125. package/SVF-osx/Release-build/include/Util/CallGraphBuilder.h +0 -61
  126. package/SVF-osx/Release-build/include/Util/Casting.h +0 -426
  127. package/SVF-osx/Release-build/include/Util/CommandLine.h +0 -530
  128. package/SVF-osx/Release-build/include/Util/CoreBitVector.h +0 -214
  129. package/SVF-osx/Release-build/include/Util/CxtStmt.h +0 -502
  130. package/SVF-osx/Release-build/include/Util/DPItem.h +0 -618
  131. package/SVF-osx/Release-build/include/Util/ExtAPI.h +0 -117
  132. package/SVF-osx/Release-build/include/Util/GeneralType.h +0 -127
  133. package/SVF-osx/Release-build/include/Util/GraphReachSolver.h +0 -186
  134. package/SVF-osx/Release-build/include/Util/NodeIDAllocator.h +0 -203
  135. package/SVF-osx/Release-build/include/Util/Options.h +0 -273
  136. package/SVF-osx/Release-build/include/Util/PTAStat.h +0 -83
  137. package/SVF-osx/Release-build/include/Util/SVFBugReport.h +0 -427
  138. package/SVF-osx/Release-build/include/Util/SVFLoopAndDomInfo.h +0 -169
  139. package/SVF-osx/Release-build/include/Util/SVFStat.h +0 -103
  140. package/SVF-osx/Release-build/include/Util/SVFUtil.h +0 -478
  141. package/SVF-osx/Release-build/include/Util/SparseBitVector.h +0 -1252
  142. package/SVF-osx/Release-build/include/Util/ThreadAPI.h +0 -188
  143. package/SVF-osx/Release-build/include/Util/WorkList.h +0 -317
  144. package/SVF-osx/Release-build/include/Util/Z3Expr.h +0 -325
  145. package/SVF-osx/Release-build/include/Util/cJSON.h +0 -300
  146. package/SVF-osx/Release-build/include/Util/iterator.h +0 -407
  147. package/SVF-osx/Release-build/include/Util/iterator_range.h +0 -76
  148. package/SVF-osx/Release-build/include/WPA/Andersen.h +0 -434
  149. package/SVF-osx/Release-build/include/WPA/AndersenPWC.h +0 -160
  150. package/SVF-osx/Release-build/include/WPA/CSC.h +0 -95
  151. package/SVF-osx/Release-build/include/WPA/FlowSensitive.h +0 -322
  152. package/SVF-osx/Release-build/include/WPA/Steensgaard.h +0 -131
  153. package/SVF-osx/Release-build/include/WPA/TypeAnalysis.h +0 -90
  154. package/SVF-osx/Release-build/include/WPA/VersionedFlowSensitive.h +0 -295
  155. package/SVF-osx/Release-build/include/WPA/WPAFSSolver.h +0 -246
  156. package/SVF-osx/Release-build/include/WPA/WPAPass.h +0 -115
  157. package/SVF-osx/Release-build/include/WPA/WPASolver.h +0 -205
  158. package/SVF-osx/Release-build/include/WPA/WPAStat.h +0 -222
  159. package/SVF-osx/Release-build/lib/extapi.bc +0 -2384
  160. package/SVF-osx/Release-build/lib/libSvfCore.3.1.dylib +0 -0
  161. package/SVF-osx/Release-build/lib/libSvfCore.3.dylib +0 -0
  162. package/SVF-osx/Release-build/lib/libSvfCore.dylib +0 -0
  163. package/SVF-osx/Release-build/lib/libSvfLLVM.3.1.dylib +0 -0
  164. package/SVF-osx/Release-build/lib/libSvfLLVM.3.dylib +0 -0
  165. package/SVF-osx/Release-build/lib/libSvfLLVM.dylib +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svf-lib",
3
- "version": "1.0.2318",
3
+ "version": "1.0.2319",
4
4
  "description": "SVF's npm support",
5
5
  "main": "index.js",
6
6
  "scripts": {
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,425 +0,0 @@
1
- //===- AbstractExeState.h ----Interval Domain-------------------------//
2
- //
3
- // SVF: Static Value-Flow Analysis
4
- //
5
- // Copyright (C) <2013-2022> <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
- * IntervalExeState.h
24
- *
25
- * Created on: Jul 9, 2022
26
- * Author: Xiao Cheng, Jiawei Wang
27
- *
28
- * [-oo,+oo]
29
- * / / \ \
30
- * [-oo,1] ... [-oo,10] ... [-1,+oo] ... [0,+oo]
31
- * \ \ / /
32
- * \ [-1,10] /
33
- * \ / \ /
34
- * ... [-1,1] ... [0,10] ...
35
- * \ | \ / \ /
36
- * ... [-1,0] [0,1] ... [1,9] ...
37
- * \ | \ | \ /
38
- * ... [-1,-1] [0,0] [1,1] ...
39
- * \ \ \ / /
40
- * ⊥
41
- */
42
- // The implementation is based on
43
- // Xiao Cheng, Jiawei Wang and Yulei Sui. Precise Sparse Abstract Execution via Cross-Domain Interaction.
44
- // 46th International Conference on Software Engineering. (ICSE24)
45
-
46
- #ifndef Z3_EXAMPLE_INTERVAL_DOMAIN_H
47
- #define Z3_EXAMPLE_INTERVAL_DOMAIN_H
48
-
49
- #include "AE/Core/AbstractValue.h"
50
- #include "AE/Core/IntervalValue.h"
51
- #include "SVFIR/SVFVariables.h"
52
- #include "Util/Z3Expr.h"
53
-
54
- #include <iomanip>
55
-
56
- namespace SVF
57
- {
58
- class AbstractState
59
- {
60
- friend class SVFIR2AbsState;
61
- friend class RelationSolver;
62
- public:
63
- typedef Map<u32_t, AbstractValue> VarToAbsValMap;
64
- typedef VarToAbsValMap AddrToAbsValMap;
65
- Set<NodeID> _freedAddrs;
66
-
67
-
68
- public:
69
- /// default constructor
70
- AbstractState()
71
- {
72
- }
73
-
74
- AbstractState(VarToAbsValMap&_varToValMap, AddrToAbsValMap&_locToValMap) : _varToAbsVal(_varToValMap), _addrToAbsVal(_locToValMap) {}
75
-
76
- /// copy constructor
77
- AbstractState(const AbstractState&rhs) : _freedAddrs(rhs._freedAddrs), _varToAbsVal(rhs.getVarToVal()), _addrToAbsVal(rhs.getLocToVal())
78
- {
79
-
80
- }
81
-
82
- virtual ~AbstractState() = default;
83
-
84
- // getGepObjAddrs
85
- AddressValue getGepObjAddrs(u32_t pointer, IntervalValue offset);
86
-
87
- // initObjVar
88
- void initObjVar(ObjVar* objVar);
89
- // getElementIndex
90
- IntervalValue getElementIndex(const GepStmt* gep);
91
- // getByteOffset
92
- IntervalValue getByteOffset(const GepStmt* gep);
93
- // printAbstractState
94
- // loadValue
95
- AbstractValue loadValue(NodeID varId);
96
- // storeValue
97
- void storeValue(NodeID varId, AbstractValue val);
98
-
99
- u32_t getAllocaInstByteSize(const AddrStmt *addr);
100
-
101
-
102
- /// The physical address starts with 0x7f...... + idx
103
- static inline u32_t getVirtualMemAddress(u32_t idx)
104
- {
105
- return AddressValue::getVirtualMemAddress(idx);
106
- }
107
-
108
- /// Check bit value of val start with 0x7F000000, filter by 0xFF000000
109
- static inline bool isVirtualMemAddress(u32_t val)
110
- {
111
- return AddressValue::isVirtualMemAddress(val);
112
- }
113
-
114
- /// Return the internal index if addr is an address otherwise return the value of idx
115
- inline u32_t getIDFromAddr(u32_t addr)
116
- {
117
- return _freedAddrs.count(addr) ? AddressValue::getInternalID(InvalidMemAddr) : AddressValue::getInternalID(addr);
118
- }
119
-
120
- AbstractState&operator=(const AbstractState&rhs)
121
- {
122
- if (rhs != *this)
123
- {
124
- _varToAbsVal = rhs._varToAbsVal;
125
- _addrToAbsVal = rhs._addrToAbsVal;
126
- _freedAddrs = rhs._freedAddrs;
127
- }
128
- return *this;
129
- }
130
-
131
- /// move constructor
132
- AbstractState(AbstractState&&rhs) : _varToAbsVal(std::move(rhs._varToAbsVal)),
133
- _addrToAbsVal(std::move(rhs._addrToAbsVal))
134
- {
135
-
136
- }
137
-
138
- /// operator= move constructor
139
- AbstractState&operator=(AbstractState&&rhs)
140
- {
141
- if (&rhs != this)
142
- {
143
- _varToAbsVal = std::move(rhs._varToAbsVal);
144
- _addrToAbsVal = std::move(rhs._addrToAbsVal);
145
- _freedAddrs = std::move(rhs._freedAddrs);
146
- }
147
- return *this;
148
- }
149
-
150
- /// Set all value bottom
151
- AbstractState bottom() const
152
- {
153
- AbstractState inv = *this;
154
- for (auto &item: inv._varToAbsVal)
155
- {
156
- if (item.second.isInterval())
157
- item.second.getInterval().set_to_bottom();
158
- }
159
- return inv;
160
- }
161
-
162
- /// Set all value top
163
- AbstractState top() const
164
- {
165
- AbstractState inv = *this;
166
- for (auto &item: inv._varToAbsVal)
167
- {
168
- if (item.second.isInterval())
169
- item.second.getInterval().set_to_top();
170
- }
171
- return inv;
172
- }
173
-
174
- /// Copy some values and return a new IntervalExeState
175
- AbstractState sliceState(Set<u32_t> &sl)
176
- {
177
- AbstractState inv;
178
- for (u32_t id: sl)
179
- {
180
- inv._varToAbsVal[id] = _varToAbsVal[id];
181
- }
182
- return inv;
183
- }
184
-
185
- static inline bool isNullMem(u32_t addr)
186
- {
187
- return AddressValue::getInternalID(addr) == NullMemAddr;
188
- }
189
-
190
- static inline bool isInvalidMem(u32_t addr)
191
- {
192
- return AddressValue::getInternalID(addr) == InvalidMemAddr;
193
- }
194
-
195
-
196
- protected:
197
- VarToAbsValMap _varToAbsVal; ///< Map a variable (symbol) to its abstract value
198
- AddrToAbsValMap
199
- _addrToAbsVal; ///< Map a memory address to its stored abstract value
200
-
201
- public:
202
-
203
-
204
- /// get abstract value of variable
205
- inline virtual AbstractValue &operator[](u32_t varId)
206
- {
207
- return _varToAbsVal[varId];
208
- }
209
-
210
- /// get abstract value of variable
211
- inline virtual const AbstractValue &operator[](u32_t varId) const
212
- {
213
- return _varToAbsVal.at(varId);
214
- }
215
-
216
- /// whether the variable is in varToAddrs table
217
- inline bool inVarToAddrsTable(u32_t id) const
218
- {
219
- if (_varToAbsVal.find(id)!= _varToAbsVal.end())
220
- {
221
- if (_varToAbsVal.at(id).isAddr())
222
- {
223
- return true;
224
- }
225
- }
226
- return false;
227
- }
228
-
229
- /// whether the variable is in varToVal table
230
- inline virtual bool inVarToValTable(u32_t id) const
231
- {
232
- if (_varToAbsVal.find(id) != _varToAbsVal.end())
233
- {
234
- if (_varToAbsVal.at(id).isInterval())
235
- {
236
- return true;
237
- }
238
- }
239
- return false;
240
- }
241
-
242
- /// whether the memory address stores memory addresses
243
- inline bool inAddrToAddrsTable(u32_t id) const
244
- {
245
- if (_addrToAbsVal.find(id)!= _addrToAbsVal.end())
246
- {
247
- if (_addrToAbsVal.at(id).isAddr())
248
- {
249
- return true;
250
- }
251
- }
252
- return false;
253
- }
254
-
255
- /// whether the memory address stores abstract value
256
- inline virtual bool inAddrToValTable(u32_t id) const
257
- {
258
- if (_addrToAbsVal.find(id) != _addrToAbsVal.end())
259
- {
260
- if (_addrToAbsVal.at(id).isInterval())
261
- {
262
- return true;
263
- }
264
- }
265
- return false;
266
- }
267
-
268
- /// get var2val map
269
- const VarToAbsValMap&getVarToVal() const
270
- {
271
- return _varToAbsVal;
272
- }
273
-
274
- /// get loc2val map
275
- const AddrToAbsValMap&getLocToVal() const
276
- {
277
- return _addrToAbsVal;
278
- }
279
-
280
- public:
281
-
282
- /// domain widen with other, and return the widened domain
283
- AbstractState widening(const AbstractState&other);
284
-
285
- /// domain narrow with other, and return the narrowed domain
286
- AbstractState narrowing(const AbstractState&other);
287
-
288
- /// domain join with other, important! other widen this.
289
- void joinWith(const AbstractState&other);
290
-
291
- /// domain meet with other, important! other widen this.
292
- void meetWith(const AbstractState&other);
293
-
294
- void addToFreedAddrs(NodeID addr)
295
- {
296
- _freedAddrs.insert(addr);
297
- }
298
-
299
- bool isFreedMem(u32_t addr) const
300
- {
301
- return _freedAddrs.find(addr) != _freedAddrs.end();
302
- }
303
-
304
-
305
- /**
306
- * if this NodeID in SVFIR is a pointer, get the pointee type
307
- * e.g arr = (int*) malloc(10*sizeof(int))
308
- * getPointeeType(arr) -> return int
309
- * we can set arr[0]='c', arr[1]='c', arr[2]='\0'
310
- * @param call callnode of memset like api
311
- */
312
- const SVFType* getPointeeElement(NodeID id);
313
-
314
-
315
- u32_t hash() const;
316
-
317
- public:
318
- inline void store(u32_t addr, const AbstractValue &val)
319
- {
320
- assert(isVirtualMemAddress(addr) && "not virtual address?");
321
- u32_t objId = getIDFromAddr(addr);
322
- if (isNullMem(addr)) return;
323
- _addrToAbsVal[objId] = val;
324
- }
325
-
326
- inline virtual AbstractValue &load(u32_t addr)
327
- {
328
- assert(isVirtualMemAddress(addr) && "not virtual address?");
329
- u32_t objId = getIDFromAddr(addr);
330
- return _addrToAbsVal[objId];
331
-
332
- }
333
-
334
- void printAbstractState() const;
335
-
336
- std::string toString() const
337
- {
338
- return "";
339
- }
340
-
341
- bool equals(const AbstractState&other) const;
342
-
343
-
344
- static bool eqVarToValMap(const VarToAbsValMap&lhs, const VarToAbsValMap&rhs)
345
- {
346
- if (lhs.size() != rhs.size()) return false;
347
- for (const auto &item: lhs)
348
- {
349
- auto it = rhs.find(item.first);
350
- if (it == rhs.end())
351
- return false;
352
- if (!item.second.equals(it->second))
353
- return false;
354
- else
355
- {
356
- }
357
- }
358
- return true;
359
- }
360
-
361
- static bool lessThanVarToValMap(const VarToAbsValMap&lhs, const VarToAbsValMap&rhs)
362
- {
363
- if (lhs.empty()) return !rhs.empty();
364
- for (const auto &item: lhs)
365
- {
366
- auto it = rhs.find(item.first);
367
- if (it == rhs.end()) return false;
368
- // judge from expr id
369
- if (item.second.getInterval().contain(it->second.getInterval())) return false;
370
- }
371
- return true;
372
- }
373
-
374
- // lhs >= rhs
375
- static bool geqVarToValMap(const VarToAbsValMap&lhs, const VarToAbsValMap&rhs)
376
- {
377
- if (rhs.empty()) return true;
378
- for (const auto &item: rhs)
379
- {
380
- auto it = lhs.find(item.first);
381
- if (it == lhs.end()) return false;
382
- // judge from expr id
383
- if (!it->second.getInterval().contain(
384
- item.second.getInterval()))
385
- return false;
386
-
387
- }
388
- return true;
389
- }
390
-
391
- bool operator==(const AbstractState&rhs) const
392
- {
393
- return eqVarToValMap(_varToAbsVal, rhs.getVarToVal()) &&
394
- eqVarToValMap(_addrToAbsVal, rhs.getLocToVal());
395
- }
396
-
397
- bool operator!=(const AbstractState&rhs) const
398
- {
399
- return !(*this == rhs);
400
- }
401
-
402
- bool operator<(const AbstractState&rhs) const
403
- {
404
- return !(*this >= rhs);
405
- }
406
-
407
-
408
- bool operator>=(const AbstractState&rhs) const
409
- {
410
- return geqVarToValMap(_varToAbsVal, rhs.getVarToVal()) && geqVarToValMap(_addrToAbsVal, rhs.getLocToVal());
411
- }
412
-
413
- void clear()
414
- {
415
- _addrToAbsVal.clear();
416
- _varToAbsVal.clear();
417
- _freedAddrs.clear();
418
- }
419
-
420
- };
421
-
422
- }
423
-
424
-
425
- #endif //Z3_EXAMPLE_INTERVAL_DOMAIN_H
@@ -1,157 +0,0 @@
1
- //===- AbstractValue.h ----AbstractValue-------------------------//
2
- //
3
- // SVF: Static Value-Flow Analysis
4
- //
5
- // Copyright (C) <2013-2022> <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
- // The implementation is based on
24
- // Xiao Cheng, Jiawei Wang and Yulei Sui. Precise Sparse Abstract Execution via Cross-Domain Interaction.
25
- // 46th International Conference on Software Engineering. (ICSE24)
26
-
27
- #include "AE/Core/IntervalValue.h"
28
- #include "AE/Core/AddressValue.h"
29
- #include "Util/SVFUtil.h"
30
-
31
- namespace SVF
32
- {
33
-
34
- class AbstractValue
35
- {
36
-
37
- public:
38
- IntervalValue interval;
39
- AddressValue addrs;
40
-
41
- AbstractValue()
42
- {
43
- interval = IntervalValue::bottom();
44
- addrs = AddressValue();
45
- }
46
-
47
- AbstractValue(const AbstractValue& other)
48
- {
49
- interval = other.interval;
50
- addrs = other.addrs;
51
- }
52
-
53
- inline bool isInterval() const
54
- {
55
- return !interval.isBottom();
56
- }
57
- inline bool isAddr() const
58
- {
59
- return !addrs.isBottom();
60
- }
61
-
62
- AbstractValue(AbstractValue &&other)
63
- {
64
- interval = SVFUtil::move(other.interval);
65
- addrs = SVFUtil::move(other.addrs);
66
- }
67
-
68
- // operator overload, supporting both interval and address
69
- AbstractValue& operator=(const AbstractValue& other)
70
- {
71
- interval = other.interval;
72
- addrs = other.addrs;
73
- return *this;
74
- }
75
-
76
- AbstractValue& operator=(const AbstractValue&& other)
77
- {
78
- interval = SVFUtil::move(other.interval);
79
- addrs = SVFUtil::move(other.addrs);
80
- return *this;
81
- }
82
-
83
- AbstractValue& operator=(const IntervalValue& other)
84
- {
85
- interval = other;
86
- addrs = AddressValue();
87
- return *this;
88
- }
89
-
90
- AbstractValue& operator=(const AddressValue& other)
91
- {
92
- addrs = other;
93
- interval = IntervalValue::bottom();
94
- return *this;
95
- }
96
-
97
- AbstractValue(const IntervalValue& ival) : interval(ival), addrs(AddressValue()) {}
98
-
99
- AbstractValue(const AddressValue& addr) : interval(IntervalValue::bottom()), addrs(addr) {}
100
-
101
- IntervalValue& getInterval()
102
- {
103
- return interval;
104
- }
105
-
106
- const IntervalValue getInterval() const
107
- {
108
- return interval;
109
- }
110
-
111
- AddressValue& getAddrs()
112
- {
113
- return addrs;
114
- }
115
-
116
- const AddressValue getAddrs() const
117
- {
118
- return addrs;
119
- }
120
-
121
- ~AbstractValue() {};
122
-
123
- bool equals(const AbstractValue &rhs) const
124
- {
125
- return interval.equals(rhs.interval) && addrs.equals(rhs.addrs);
126
- }
127
-
128
- void join_with(const AbstractValue &other)
129
- {
130
- interval.join_with(other.interval);
131
- addrs.join_with(other.addrs);
132
- }
133
-
134
- void meet_with(const AbstractValue &other)
135
- {
136
- interval.meet_with(other.interval);
137
- addrs.meet_with(other.addrs);
138
- }
139
-
140
- void widen_with(const AbstractValue &other)
141
- {
142
- interval.widen_with(other.interval);
143
- // TODO: widen Addrs
144
- }
145
-
146
- void narrow_with(const AbstractValue &other)
147
- {
148
- interval.narrow_with(other.interval);
149
- // TODO: narrow Addrs
150
- }
151
-
152
- std::string toString() const
153
- {
154
- return "<" + interval.toString() + ", " + addrs.toString() + ">";
155
- }
156
- };
157
- }