svf-tools 1.0.771 → 1.0.772
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.
- package/SVF-doxygen/html/html/SVFIR2ItvExeState_8cpp_source.html +792 -770
- package/SVF-doxygen/html/html/SVFIR2ItvExeState_8h_source.html +25 -25
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ItvExeState-members.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ItvExeState.html +796 -774
- package/SVF-doxygen/html/html/functions_func_g.html +5 -5
- package/SVF-doxygen/html/html/functions_g.html +5 -5
- package/SVF-doxygen/html/html/search/all_7.js +5 -5
- package/SVF-doxygen/html/html/search/functions_7.js +5 -5
- package/package.json +1 -1
- package/svf/include/AbstractExecution/SVFIR2ItvExeState.h +5 -5
- package/svf/lib/AbstractExecution/SVFIR2ItvExeState.cpp +77 -57
|
@@ -368,7 +368,7 @@ $(function() {
|
|
|
368
368
|
: <a class="el" href="classSVF_1_1CondPTAImpl.html#a94f3e4d073b8c5bab3c46058ddba3f43">SVF::CondPTAImpl< Cond ></a>
|
|
369
369
|
</li>
|
|
370
370
|
<li>getBytefromGepTypePair()
|
|
371
|
-
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
371
|
+
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#a2f0fe665f2153115be84a143633b6b3b">SVF::SVFIR2ItvExeState</a>
|
|
372
372
|
</li>
|
|
373
373
|
<li>getCachedADPointsTo()
|
|
374
374
|
: <a class="el" href="classSVF_1_1DDAVFSolver.html#a2a2b3783074c9f509fc265b97b979704">SVF::DDAVFSolver< CVar, CPtSet, DPIm ></a>
|
|
@@ -1249,14 +1249,14 @@ $(function() {
|
|
|
1249
1249
|
: <a class="el" href="classSVF_1_1MemSSA.html#a44cbdb1231c2709c24d19ad2bae2475a">SVF::MemSSA</a>
|
|
1250
1250
|
</li>
|
|
1251
1251
|
<li>getGepByteOffset()
|
|
1252
|
-
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
1252
|
+
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#a24f009ea362c4acf1cfa44d4dd80ef8b">SVF::SVFIR2ItvExeState</a>
|
|
1253
1253
|
</li>
|
|
1254
1254
|
<li>getGepInEdges()
|
|
1255
1255
|
: <a class="el" href="classSVF_1_1ConstraintNode.html#ac645cf2114161981cd4465c83cbc31f5">SVF::ConstraintNode</a>
|
|
1256
1256
|
</li>
|
|
1257
1257
|
<li>getGepObjAddress()
|
|
1258
1258
|
: <a class="el" href="classSVF_1_1SVFIR2ConsExeState.html#afc9c3372eb142afdb3eb8956adf53c33">SVF::SVFIR2ConsExeState</a>
|
|
1259
|
-
, <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
1259
|
+
, <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#a67532bdc1e4a49cf4d9da4b99b38e69a">SVF::SVFIR2ItvExeState</a>
|
|
1260
1260
|
</li>
|
|
1261
1261
|
<li>getGepObjNodeMap()
|
|
1262
1262
|
: <a class="el" href="classSVF_1_1SVFIR.html#ac1674bd25a17cae24141e6bff24a411e">SVF::SVFIR</a>
|
|
@@ -1268,7 +1268,7 @@ $(function() {
|
|
|
1268
1268
|
</li>
|
|
1269
1269
|
<li>getGepOffset()
|
|
1270
1270
|
: <a class="el" href="classSVF_1_1SVFIR2ConsExeState.html#ae7720cdcb509ecfccbda141986643684">SVF::SVFIR2ConsExeState</a>
|
|
1271
|
-
, <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
1271
|
+
, <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#afed2852aec6793e1943f97ed39dd8d2b">SVF::SVFIR2ItvExeState</a>
|
|
1272
1272
|
</li>
|
|
1273
1273
|
<li>getGepOutEdges()
|
|
1274
1274
|
: <a class="el" href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">SVF::ConstraintNode</a>
|
|
@@ -1379,7 +1379,7 @@ $(function() {
|
|
|
1379
1379
|
: <a class="el" href="classllvm_1_1generic__bridge__gep__type__iterator.html#acc10ad7ecc64270225cb5e8f52689673">llvm::generic_bridge_gep_type_iterator< ItTy ></a>
|
|
1380
1380
|
</li>
|
|
1381
1381
|
<li>getIndexfromGepTypePair()
|
|
1382
|
-
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
1382
|
+
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#aed7fc3951608972b6f8fdce14b4a0cbb">SVF::SVFIR2ItvExeState</a>
|
|
1383
1383
|
</li>
|
|
1384
1384
|
<li>getIndirectCalls()
|
|
1385
1385
|
: <a class="el" href="classSVF_1_1PTACallGraphEdge.html#a76aa19edf03a4cacfa3e27a21abfcd07">SVF::PTACallGraphEdge</a>
|
|
@@ -433,7 +433,7 @@ $(function() {
|
|
|
433
433
|
: <a class="el" href="classSVF_1_1CondPTAImpl.html#a94f3e4d073b8c5bab3c46058ddba3f43">SVF::CondPTAImpl< Cond ></a>
|
|
434
434
|
</li>
|
|
435
435
|
<li>getBytefromGepTypePair()
|
|
436
|
-
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
436
|
+
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#a2f0fe665f2153115be84a143633b6b3b">SVF::SVFIR2ItvExeState</a>
|
|
437
437
|
</li>
|
|
438
438
|
<li>getCachedADPointsTo()
|
|
439
439
|
: <a class="el" href="classSVF_1_1DDAVFSolver.html#a2a2b3783074c9f509fc265b97b979704">SVF::DDAVFSolver< CVar, CPtSet, DPIm ></a>
|
|
@@ -1314,14 +1314,14 @@ $(function() {
|
|
|
1314
1314
|
: <a class="el" href="classSVF_1_1MemSSA.html#a44cbdb1231c2709c24d19ad2bae2475a">SVF::MemSSA</a>
|
|
1315
1315
|
</li>
|
|
1316
1316
|
<li>getGepByteOffset()
|
|
1317
|
-
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
1317
|
+
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#a24f009ea362c4acf1cfa44d4dd80ef8b">SVF::SVFIR2ItvExeState</a>
|
|
1318
1318
|
</li>
|
|
1319
1319
|
<li>getGepInEdges()
|
|
1320
1320
|
: <a class="el" href="classSVF_1_1ConstraintNode.html#ac645cf2114161981cd4465c83cbc31f5">SVF::ConstraintNode</a>
|
|
1321
1321
|
</li>
|
|
1322
1322
|
<li>getGepObjAddress()
|
|
1323
1323
|
: <a class="el" href="classSVF_1_1SVFIR2ConsExeState.html#afc9c3372eb142afdb3eb8956adf53c33">SVF::SVFIR2ConsExeState</a>
|
|
1324
|
-
, <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
1324
|
+
, <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#a67532bdc1e4a49cf4d9da4b99b38e69a">SVF::SVFIR2ItvExeState</a>
|
|
1325
1325
|
</li>
|
|
1326
1326
|
<li>getGepObjNodeMap()
|
|
1327
1327
|
: <a class="el" href="classSVF_1_1SVFIR.html#ac1674bd25a17cae24141e6bff24a411e">SVF::SVFIR</a>
|
|
@@ -1333,7 +1333,7 @@ $(function() {
|
|
|
1333
1333
|
</li>
|
|
1334
1334
|
<li>getGepOffset()
|
|
1335
1335
|
: <a class="el" href="classSVF_1_1SVFIR2ConsExeState.html#ae7720cdcb509ecfccbda141986643684">SVF::SVFIR2ConsExeState</a>
|
|
1336
|
-
, <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
1336
|
+
, <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#afed2852aec6793e1943f97ed39dd8d2b">SVF::SVFIR2ItvExeState</a>
|
|
1337
1337
|
</li>
|
|
1338
1338
|
<li>getGepOutEdges()
|
|
1339
1339
|
: <a class="el" href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">SVF::ConstraintNode</a>
|
|
@@ -1444,7 +1444,7 @@ $(function() {
|
|
|
1444
1444
|
: <a class="el" href="classllvm_1_1generic__bridge__gep__type__iterator.html#acc10ad7ecc64270225cb5e8f52689673">llvm::generic_bridge_gep_type_iterator< ItTy ></a>
|
|
1445
1445
|
</li>
|
|
1446
1446
|
<li>getIndexfromGepTypePair()
|
|
1447
|
-
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#
|
|
1447
|
+
: <a class="el" href="classSVF_1_1SVFIR2ItvExeState.html#aed7fc3951608972b6f8fdce14b4a0cbb">SVF::SVFIR2ItvExeState</a>
|
|
1448
1448
|
</li>
|
|
1449
1449
|
<li>getIndirectCalls()
|
|
1450
1450
|
: <a class="el" href="classSVF_1_1PTACallGraphEdge.html#a76aa19edf03a4cacfa3e27a21abfcd07">SVF::PTACallGraphEdge</a>
|
|
@@ -232,7 +232,7 @@ var searchData=
|
|
|
232
232
|
['getbugset_2225',['getBugSet',['../classSVF_1_1SVFBugReport.html#a7dbf4adc013615567b33b6e293b61c8e',1,'SVF::SVFBugReport']]],
|
|
233
233
|
['getbugtype_2226',['getBugType',['../classSVF_1_1GenericBug.html#a693839b33e167cd0688be2e1738198f2',1,'SVF::GenericBug']]],
|
|
234
234
|
['getbvpointsto_2227',['getBVPointsTo',['../classSVF_1_1CondPTAImpl.html#a94f3e4d073b8c5bab3c46058ddba3f43',1,'SVF::CondPTAImpl']]],
|
|
235
|
-
['getbytefromgeptypepair_2228',['getBytefromGepTypePair',['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
235
|
+
['getbytefromgeptypepair_2228',['getBytefromGepTypePair',['../classSVF_1_1SVFIR2ItvExeState.html#a2f0fe665f2153115be84a143633b6b3b',1,'SVF::SVFIR2ItvExeState']]],
|
|
236
236
|
['getcachedadpointsto_2229',['getCachedADPointsTo',['../classSVF_1_1DDAVFSolver.html#a2a2b3783074c9f509fc265b97b979704',1,'SVF::DDAVFSolver']]],
|
|
237
237
|
['getcachedpointsto_2230',['getCachedPointsTo',['../classSVF_1_1DDAVFSolver.html#ae31e9281e4f1e0585fdf328b7339e1bf',1,'SVF::DDAVFSolver']]],
|
|
238
238
|
['getcachedtlpointsto_2231',['getCachedTLPointsTo',['../classSVF_1_1DDAVFSolver.html#aac432dfa7ccfc3434d9e0e2eb65afe7f',1,'SVF::DDAVFSolver::getCachedTLPointsTo()'],['../classSVF_1_1FlowDDA.html#a950d653b249cfc2d20932adb3498b99b',1,'SVF::FlowDDA::getCachedTLPointsTo()']]],
|
|
@@ -481,12 +481,12 @@ var searchData=
|
|
|
481
481
|
['getfuntoentrychisetmap_2474',['getFunToEntryChiSetMap',['../classSVF_1_1MemSSA.html#afd4787df4466c24948d8384e3a756198',1,'SVF::MemSSA']]],
|
|
482
482
|
['getfuntopointstolist_2475',['getFunToPointsToList',['../classSVF_1_1MRGenerator.html#a1331e6f0941838064d77a5adaa5c6303',1,'SVF::MRGenerator']]],
|
|
483
483
|
['getfuntoretmusetmap_2476',['getFunToRetMuSetMap',['../classSVF_1_1MemSSA.html#a44cbdb1231c2709c24d19ad2bae2475a',1,'SVF::MemSSA']]],
|
|
484
|
-
['getgepbyteoffset_2477',['getGepByteOffset',['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
484
|
+
['getgepbyteoffset_2477',['getGepByteOffset',['../classSVF_1_1SVFIR2ItvExeState.html#a24f009ea362c4acf1cfa44d4dd80ef8b',1,'SVF::SVFIR2ItvExeState']]],
|
|
485
485
|
['getgepinedges_2478',['getGepInEdges',['../classSVF_1_1ConstraintNode.html#ac645cf2114161981cd4465c83cbc31f5',1,'SVF::ConstraintNode']]],
|
|
486
|
-
['getgepobjaddress_2479',['getGepObjAddress',['../classSVF_1_1SVFIR2ConsExeState.html#afc9c3372eb142afdb3eb8956adf53c33',1,'SVF::SVFIR2ConsExeState::getGepObjAddress()'],['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
486
|
+
['getgepobjaddress_2479',['getGepObjAddress',['../classSVF_1_1SVFIR2ConsExeState.html#afc9c3372eb142afdb3eb8956adf53c33',1,'SVF::SVFIR2ConsExeState::getGepObjAddress()'],['../classSVF_1_1SVFIR2ItvExeState.html#a67532bdc1e4a49cf4d9da4b99b38e69a',1,'SVF::SVFIR2ItvExeState::getGepObjAddress()']]],
|
|
487
487
|
['getgepobjnodemap_2480',['getGepObjNodeMap',['../classSVF_1_1SVFIR.html#ac1674bd25a17cae24141e6bff24a411e',1,'SVF::SVFIR']]],
|
|
488
488
|
['getgepobjvar_2481',['getGepObjVar',['../classSVF_1_1ConstraintGraph.html#a64c3531053c084bf7195c0900d8902c9',1,'SVF::ConstraintGraph::getGepObjVar()'],['../classSVF_1_1PointerAnalysis.html#aac6ccf3dc313e3c6761bb57316829da8',1,'SVF::PointerAnalysis::getGepObjVar()'],['../classSVF_1_1SVFIR.html#ae18425df0631aefca7dd4b799f6f524a',1,'SVF::SVFIR::getGepObjVar(const MemObj *obj, const APOffset &ap)'],['../classSVF_1_1SVFIR.html#a7abc062d05db516ece2805949aa45c46',1,'SVF::SVFIR::getGepObjVar(NodeID id, const APOffset &ap)']]],
|
|
489
|
-
['getgepoffset_2482',['getGepOffset',['../classSVF_1_1SVFIR2ConsExeState.html#ae7720cdcb509ecfccbda141986643684',1,'SVF::SVFIR2ConsExeState::getGepOffset()'],['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
489
|
+
['getgepoffset_2482',['getGepOffset',['../classSVF_1_1SVFIR2ConsExeState.html#ae7720cdcb509ecfccbda141986643684',1,'SVF::SVFIR2ConsExeState::getGepOffset()'],['../classSVF_1_1SVFIR2ItvExeState.html#afed2852aec6793e1943f97ed39dd8d2b',1,'SVF::SVFIR2ItvExeState::getGepOffset()']]],
|
|
490
490
|
['getgepoutedges_2483',['getGepOutEdges',['../classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8',1,'SVF::ConstraintNode']]],
|
|
491
491
|
['getgepvalvar_2484',['getGepValVar',['../classSVF_1_1SVFIRBuilder.html#ae4516ec05eabece1bc8e0cad1ec8cf1c',1,'SVF::SVFIRBuilder::getGepValVar()'],['../classSVF_1_1SVFIR.html#ad0977d55d947bdccd98d61c66d3f0cc7',1,'SVF::SVFIR::getGepValVar()']]],
|
|
492
492
|
['getglobalicfgnode_2485',['getGlobalICFGNode',['../classSVF_1_1ICFG.html#ae0b05ce161d62362642803158228e5d0',1,'SVF::ICFG']]],
|
|
@@ -521,7 +521,7 @@ var searchData=
|
|
|
521
521
|
['getindcallsitesinvokingcallee_2514',['getIndCallSitesInvokingCallee',['../classSVF_1_1PTACallGraph.html#a9a4b0c6672288b9201ab254b4c49548d',1,'SVF::PTACallGraph']]],
|
|
522
522
|
['getindcscallees_2515',['getIndCSCallees',['../classSVF_1_1PTACallGraph.html#ac106536778c829d6925d6ed2149aeb44',1,'SVF::PTACallGraph::getIndCSCallees()'],['../classSVF_1_1PointerAnalysis.html#ae0efd57376195eacded85d58abee5b46',1,'SVF::PointerAnalysis::getIndCSCallees()']]],
|
|
523
523
|
['getindexedtype_2516',['getIndexedType',['../classllvm_1_1generic__bridge__gep__type__iterator.html#acc10ad7ecc64270225cb5e8f52689673',1,'llvm::generic_bridge_gep_type_iterator']]],
|
|
524
|
-
['getindexfromgeptypepair_2517',['getIndexfromGepTypePair',['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
524
|
+
['getindexfromgeptypepair_2517',['getIndexfromGepTypePair',['../classSVF_1_1SVFIR2ItvExeState.html#aed7fc3951608972b6f8fdce14b4a0cbb',1,'SVF::SVFIR2ItvExeState']]],
|
|
525
525
|
['getindirectcalls_2518',['getIndirectCalls',['../classSVF_1_1PTACallGraphEdge.html#a76aa19edf03a4cacfa3e27a21abfcd07',1,'SVF::PTACallGraphEdge::getIndirectCalls()'],['../classSVF_1_1PTACallGraphEdge.html#a51dbd8a7b9d0a4602215f71e3fdfee5f',1,'SVF::PTACallGraphEdge::getIndirectCalls() const']]],
|
|
526
526
|
['getindirectcallsites_2519',['getIndirectCallsites',['../classSVF_1_1ConstraintGraph.html#a48a71f212e368769218a6f332822c976',1,'SVF::ConstraintGraph::getIndirectCallsites()'],['../classSVF_1_1PointerAnalysis.html#a9d3e7753643166465b0d647a75bc145a',1,'SVF::PointerAnalysis::getIndirectCallsites()'],['../classSVF_1_1SVFIR.html#a2d2131128ceb3362b5dc89317cfd88a0',1,'SVF::SVFIR::getIndirectCallsites()']]],
|
|
527
527
|
['getinedges_2520',['getInEdges',['../classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b',1,'SVF::GenericNode']]],
|
|
@@ -96,7 +96,7 @@ var searchData=
|
|
|
96
96
|
['getbugset_8129',['getBugSet',['../classSVF_1_1SVFBugReport.html#a7dbf4adc013615567b33b6e293b61c8e',1,'SVF::SVFBugReport']]],
|
|
97
97
|
['getbugtype_8130',['getBugType',['../classSVF_1_1GenericBug.html#a693839b33e167cd0688be2e1738198f2',1,'SVF::GenericBug']]],
|
|
98
98
|
['getbvpointsto_8131',['getBVPointsTo',['../classSVF_1_1CondPTAImpl.html#a94f3e4d073b8c5bab3c46058ddba3f43',1,'SVF::CondPTAImpl']]],
|
|
99
|
-
['getbytefromgeptypepair_8132',['getBytefromGepTypePair',['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
99
|
+
['getbytefromgeptypepair_8132',['getBytefromGepTypePair',['../classSVF_1_1SVFIR2ItvExeState.html#a2f0fe665f2153115be84a143633b6b3b',1,'SVF::SVFIR2ItvExeState']]],
|
|
100
100
|
['getcachedadpointsto_8133',['getCachedADPointsTo',['../classSVF_1_1DDAVFSolver.html#a2a2b3783074c9f509fc265b97b979704',1,'SVF::DDAVFSolver']]],
|
|
101
101
|
['getcachedpointsto_8134',['getCachedPointsTo',['../classSVF_1_1DDAVFSolver.html#ae31e9281e4f1e0585fdf328b7339e1bf',1,'SVF::DDAVFSolver']]],
|
|
102
102
|
['getcachedtlpointsto_8135',['getCachedTLPointsTo',['../classSVF_1_1DDAVFSolver.html#aac432dfa7ccfc3434d9e0e2eb65afe7f',1,'SVF::DDAVFSolver::getCachedTLPointsTo()'],['../classSVF_1_1FlowDDA.html#a950d653b249cfc2d20932adb3498b99b',1,'SVF::FlowDDA::getCachedTLPointsTo()']]],
|
|
@@ -344,12 +344,12 @@ var searchData=
|
|
|
344
344
|
['getfuntoentrychisetmap_8377',['getFunToEntryChiSetMap',['../classSVF_1_1MemSSA.html#afd4787df4466c24948d8384e3a756198',1,'SVF::MemSSA']]],
|
|
345
345
|
['getfuntopointstolist_8378',['getFunToPointsToList',['../classSVF_1_1MRGenerator.html#a1331e6f0941838064d77a5adaa5c6303',1,'SVF::MRGenerator']]],
|
|
346
346
|
['getfuntoretmusetmap_8379',['getFunToRetMuSetMap',['../classSVF_1_1MemSSA.html#a44cbdb1231c2709c24d19ad2bae2475a',1,'SVF::MemSSA']]],
|
|
347
|
-
['getgepbyteoffset_8380',['getGepByteOffset',['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
347
|
+
['getgepbyteoffset_8380',['getGepByteOffset',['../classSVF_1_1SVFIR2ItvExeState.html#a24f009ea362c4acf1cfa44d4dd80ef8b',1,'SVF::SVFIR2ItvExeState']]],
|
|
348
348
|
['getgepinedges_8381',['getGepInEdges',['../classSVF_1_1ConstraintNode.html#ac645cf2114161981cd4465c83cbc31f5',1,'SVF::ConstraintNode']]],
|
|
349
|
-
['getgepobjaddress_8382',['getGepObjAddress',['../classSVF_1_1SVFIR2ConsExeState.html#afc9c3372eb142afdb3eb8956adf53c33',1,'SVF::SVFIR2ConsExeState::getGepObjAddress()'],['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
349
|
+
['getgepobjaddress_8382',['getGepObjAddress',['../classSVF_1_1SVFIR2ConsExeState.html#afc9c3372eb142afdb3eb8956adf53c33',1,'SVF::SVFIR2ConsExeState::getGepObjAddress()'],['../classSVF_1_1SVFIR2ItvExeState.html#a67532bdc1e4a49cf4d9da4b99b38e69a',1,'SVF::SVFIR2ItvExeState::getGepObjAddress()']]],
|
|
350
350
|
['getgepobjnodemap_8383',['getGepObjNodeMap',['../classSVF_1_1SVFIR.html#ac1674bd25a17cae24141e6bff24a411e',1,'SVF::SVFIR']]],
|
|
351
351
|
['getgepobjvar_8384',['getGepObjVar',['../classSVF_1_1ConstraintGraph.html#a64c3531053c084bf7195c0900d8902c9',1,'SVF::ConstraintGraph::getGepObjVar()'],['../classSVF_1_1PointerAnalysis.html#aac6ccf3dc313e3c6761bb57316829da8',1,'SVF::PointerAnalysis::getGepObjVar()'],['../classSVF_1_1SVFIR.html#ae18425df0631aefca7dd4b799f6f524a',1,'SVF::SVFIR::getGepObjVar(const MemObj *obj, const APOffset &ap)'],['../classSVF_1_1SVFIR.html#a7abc062d05db516ece2805949aa45c46',1,'SVF::SVFIR::getGepObjVar(NodeID id, const APOffset &ap)']]],
|
|
352
|
-
['getgepoffset_8385',['getGepOffset',['../classSVF_1_1SVFIR2ConsExeState.html#ae7720cdcb509ecfccbda141986643684',1,'SVF::SVFIR2ConsExeState::getGepOffset()'],['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
352
|
+
['getgepoffset_8385',['getGepOffset',['../classSVF_1_1SVFIR2ConsExeState.html#ae7720cdcb509ecfccbda141986643684',1,'SVF::SVFIR2ConsExeState::getGepOffset()'],['../classSVF_1_1SVFIR2ItvExeState.html#afed2852aec6793e1943f97ed39dd8d2b',1,'SVF::SVFIR2ItvExeState::getGepOffset()']]],
|
|
353
353
|
['getgepoutedges_8386',['getGepOutEdges',['../classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8',1,'SVF::ConstraintNode']]],
|
|
354
354
|
['getgepvalvar_8387',['getGepValVar',['../classSVF_1_1SVFIRBuilder.html#ae4516ec05eabece1bc8e0cad1ec8cf1c',1,'SVF::SVFIRBuilder::getGepValVar()'],['../classSVF_1_1SVFIR.html#ad0977d55d947bdccd98d61c66d3f0cc7',1,'SVF::SVFIR::getGepValVar()']]],
|
|
355
355
|
['getglobalicfgnode_8388',['getGlobalICFGNode',['../classSVF_1_1ICFG.html#ae0b05ce161d62362642803158228e5d0',1,'SVF::ICFG']]],
|
|
@@ -384,7 +384,7 @@ var searchData=
|
|
|
384
384
|
['getindcallsitesinvokingcallee_8417',['getIndCallSitesInvokingCallee',['../classSVF_1_1PTACallGraph.html#a9a4b0c6672288b9201ab254b4c49548d',1,'SVF::PTACallGraph']]],
|
|
385
385
|
['getindcscallees_8418',['getIndCSCallees',['../classSVF_1_1PTACallGraph.html#ac106536778c829d6925d6ed2149aeb44',1,'SVF::PTACallGraph::getIndCSCallees()'],['../classSVF_1_1PointerAnalysis.html#ae0efd57376195eacded85d58abee5b46',1,'SVF::PointerAnalysis::getIndCSCallees()']]],
|
|
386
386
|
['getindexedtype_8419',['getIndexedType',['../classllvm_1_1generic__bridge__gep__type__iterator.html#acc10ad7ecc64270225cb5e8f52689673',1,'llvm::generic_bridge_gep_type_iterator']]],
|
|
387
|
-
['getindexfromgeptypepair_8420',['getIndexfromGepTypePair',['../classSVF_1_1SVFIR2ItvExeState.html#
|
|
387
|
+
['getindexfromgeptypepair_8420',['getIndexfromGepTypePair',['../classSVF_1_1SVFIR2ItvExeState.html#aed7fc3951608972b6f8fdce14b4a0cbb',1,'SVF::SVFIR2ItvExeState']]],
|
|
388
388
|
['getindirectcalls_8421',['getIndirectCalls',['../classSVF_1_1PTACallGraphEdge.html#a76aa19edf03a4cacfa3e27a21abfcd07',1,'SVF::PTACallGraphEdge::getIndirectCalls()'],['../classSVF_1_1PTACallGraphEdge.html#a51dbd8a7b9d0a4602215f71e3fdfee5f',1,'SVF::PTACallGraphEdge::getIndirectCalls() const']]],
|
|
389
389
|
['getindirectcallsites_8422',['getIndirectCallsites',['../classSVF_1_1ConstraintGraph.html#a48a71f212e368769218a6f332822c976',1,'SVF::ConstraintGraph::getIndirectCallsites()'],['../classSVF_1_1PointerAnalysis.html#a9d3e7753643166465b0d647a75bc145a',1,'SVF::PointerAnalysis::getIndirectCallsites()'],['../classSVF_1_1SVFIR.html#a2d2131128ceb3362b5dc89317cfd88a0',1,'SVF::SVFIR::getIndirectCallsites()']]],
|
|
390
390
|
['getinedges_8423',['getInEdges',['../classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b',1,'SVF::GenericNode']]],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.772",
|
|
4
4
|
"description": "* <b>[TypeClone](https://github.com/SVF-tools/SVF/wiki/TypeClone) published in our [ECOOP paper](https://yuleisui.github.io/publications/ecoop20.pdf) is now available in SVF </b> * <b>SVF now uses a single script for its build. Just type [`source ./build.sh`](https://github.com/SVF-tools/SVF/blob/master/build.sh) in your terminal, that's it!</b> * <b>SVF now supports LLVM-10.0.0! </b> * <b>We thank [bsauce](https://github.com/bsauce) for writing a user manual of SVF ([link1](https://www.jianshu.com/p/068a08ec749c) and [link2](https://www.jianshu.com/p/777c30d4240e)) in Chinese </b> * <b>SVF now supports LLVM-9.0.0 (Thank [Byoungyoung Lee](https://github.com/SVF-tools/SVF/issues/142) for his help!). </b> * <b>SVF now supports a set of [field-sensitive pointer analyses](https://yuleisui.github.io/publications/sas2019a.pdf). </b> * <b>[Use SVF as an external lib](https://github.com/SVF-tools/SVF/wiki/Using-SVF-as-a-lib-in-your-own-tool) for your own project (Contributed by [Hongxu Chen](https://github.com/HongxuChen)). </b> * <b>SVF now supports LLVM-7.0.0. </b> * <b>SVF now supports Docker. [Try SVF in Docker](https://github.com/SVF-tools/SVF/wiki/Try-SVF-in-Docker)! </b> * <b>SVF now supports [LLVM-6.0.0](https://github.com/svf-tools/SVF/pull/38) (Contributed by [Jack Anthony](https://github.com/jackanth)). </b> * <b>SVF now supports [LLVM-4.0.0](https://github.com/svf-tools/SVF/pull/23) (Contributed by Jared Carlson. Thank [Jared](https://github.com/jcarlson23) and [Will](https://github.com/dtzWill) for their in-depth [discussions](https://github.com/svf-tools/SVF/pull/18) about updating SVF!) </b> * <b>SVF now supports analysis for C++ programs.</b> <br />",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -71,23 +71,23 @@ public:
|
|
|
71
71
|
void narrowVAddrs(IntervalExeState &lhs, const IntervalExeState &rhs);
|
|
72
72
|
|
|
73
73
|
/// Return the field address given a pointer points to a struct object and an offset
|
|
74
|
-
VAddrs getGepObjAddress(u32_t pointer,
|
|
74
|
+
VAddrs getGepObjAddress(u32_t pointer, APOffset offset);
|
|
75
75
|
|
|
76
76
|
/// Return the byte offset from one gep param offset
|
|
77
|
-
std::pair<
|
|
77
|
+
std::pair<APOffset, APOffset> getBytefromGepTypePair(const AccessPath::VarAndGepTypePair& gep_pair, const GepStmt *gep, APOffset elem_bytesize);
|
|
78
78
|
|
|
79
79
|
/// Return the Index offset from one gep param offset
|
|
80
|
-
std::pair<
|
|
80
|
+
std::pair<APOffset, APOffset> getIndexfromGepTypePair(const AccessPath::VarAndGepTypePair& gep_pair, const GepStmt *gep);
|
|
81
81
|
|
|
82
82
|
/// Return the byte offset expression of a GepStmt
|
|
83
83
|
/// elemBytesize is the element byte size of an static alloc or heap alloc array
|
|
84
84
|
/// e.g. GepStmt* gep = **,
|
|
85
85
|
/// s32_t elemBytesize = LLVMUtil::SVFType2ByteSize(gep->getRHSVar()->getValue()->getType());
|
|
86
86
|
/// std::pair<s32_t, s32_t> byteOffset = getGepByteOffset(gep, elemBytesize);
|
|
87
|
-
std::pair<
|
|
87
|
+
std::pair<APOffset, APOffset> getGepByteOffset(const GepStmt *gep, APOffset elemBytesize);
|
|
88
88
|
|
|
89
89
|
/// Return the offset expression of a GepStmt
|
|
90
|
-
std::pair<
|
|
90
|
+
std::pair<APOffset, APOffset> getGepOffset(const GepStmt *gep);
|
|
91
91
|
|
|
92
92
|
|
|
93
93
|
static z3::context &getContext()
|
|
@@ -152,7 +152,7 @@ void SVFIR2ItvExeState::narrowVAddrs(IntervalExeState &lhs, const IntervalExeSta
|
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
SVFIR2ItvExeState::VAddrs SVFIR2ItvExeState::getGepObjAddress(u32_t pointer,
|
|
155
|
+
SVFIR2ItvExeState::VAddrs SVFIR2ItvExeState::getGepObjAddress(u32_t pointer, APOffset offset)
|
|
156
156
|
{
|
|
157
157
|
assert(!getVAddrs(pointer).empty());
|
|
158
158
|
VAddrs &addrs = getVAddrs(pointer);
|
|
@@ -173,37 +173,53 @@ SVFIR2ItvExeState::VAddrs SVFIR2ItvExeState::getGepObjAddress(u32_t pointer, s32
|
|
|
173
173
|
return ret;
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
std::pair<
|
|
176
|
+
std::pair<APOffset, APOffset> SVFIR2ItvExeState::getBytefromGepTypePair(const AccessPath::VarAndGepTypePair& gep_pair, const GepStmt *gep, APOffset elemBytesize)
|
|
177
177
|
{
|
|
178
178
|
const SVFValue *value = gep_pair.first->getValue();
|
|
179
179
|
const SVFType *type = gep_pair.second;
|
|
180
180
|
const SVFConstantInt *op = SVFUtil::dyn_cast<SVFConstantInt>(value);
|
|
181
|
-
|
|
182
|
-
|
|
181
|
+
APOffset offsetLb = 0;
|
|
182
|
+
APOffset offsetUb = 0;
|
|
183
183
|
/// set largest byte offset is 0xFFFFFF in case of int32 overflow
|
|
184
|
-
|
|
184
|
+
APOffset maxByteLimit = 99999;
|
|
185
|
+
APOffset minByteLimit = -99999;
|
|
186
|
+
auto valueReshape = [&](s64_t offset)
|
|
187
|
+
{
|
|
188
|
+
if (offset < (s64_t)minByteLimit)
|
|
189
|
+
{
|
|
190
|
+
return minByteLimit;
|
|
191
|
+
}
|
|
192
|
+
else if (offset > (s64_t)maxByteLimit)
|
|
193
|
+
{
|
|
194
|
+
return maxByteLimit;
|
|
195
|
+
}
|
|
196
|
+
else
|
|
197
|
+
{
|
|
198
|
+
return offset;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
185
201
|
/// offset is constant but stored in variable
|
|
186
202
|
if (op)
|
|
187
203
|
{
|
|
188
|
-
offsetLb = offsetUb = op->getSExtValue() >
|
|
189
|
-
|
|
204
|
+
offsetLb = offsetUb = op->getSExtValue() > maxByteLimit
|
|
205
|
+
? maxByteLimit
|
|
206
|
+
: op->getSExtValue();
|
|
190
207
|
}
|
|
191
208
|
else
|
|
192
209
|
{
|
|
193
210
|
u32_t idx = _svfir->getValueNode(value);
|
|
194
211
|
IntervalValue &idxVal = _es[idx];
|
|
195
212
|
if (idxVal.isBottom() || idxVal.isTop())
|
|
196
|
-
return std::make_pair(0,
|
|
213
|
+
return std::make_pair(0, maxByteLimit);
|
|
197
214
|
// if idxVal is a concrete value
|
|
198
215
|
if (idxVal.is_numeral())
|
|
199
216
|
{
|
|
200
|
-
offsetLb = offsetUb = idxVal.lb().getNumeral()
|
|
201
|
-
maxFieldLimit? maxFieldLimit: idxVal.lb().getNumeral();
|
|
217
|
+
offsetLb = offsetUb = valueReshape(idxVal.lb().getNumeral());
|
|
202
218
|
}
|
|
203
219
|
else
|
|
204
220
|
{
|
|
205
|
-
offsetLb = idxVal.lb().getNumeral()
|
|
206
|
-
offsetUb = idxVal.ub().getNumeral()
|
|
221
|
+
offsetLb = valueReshape(idxVal.lb().getNumeral());
|
|
222
|
+
offsetUb = valueReshape(idxVal.ub().getNumeral());
|
|
207
223
|
}
|
|
208
224
|
}
|
|
209
225
|
|
|
@@ -224,19 +240,34 @@ std::pair<s32_t, s32_t> SVFIR2ItvExeState::getBytefromGepTypePair(const AccessPa
|
|
|
224
240
|
}
|
|
225
241
|
|
|
226
242
|
|
|
227
|
-
std::pair<
|
|
243
|
+
std::pair<APOffset, APOffset> SVFIR2ItvExeState::getIndexfromGepTypePair(const AccessPath::VarAndGepTypePair& gep_pair, const GepStmt *gep)
|
|
228
244
|
{
|
|
229
245
|
const SVFValue *value = gep_pair.first->getValue();
|
|
230
246
|
const SVFType *type = gep_pair.second;
|
|
231
247
|
const SVFConstantInt *op = SVFUtil::dyn_cast<SVFConstantInt>(value);
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
248
|
+
APOffset offsetLb = 0;
|
|
249
|
+
APOffset offsetUb = 0;
|
|
250
|
+
APOffset maxFieldLimit = (APOffset)Options::MaxFieldLimit();
|
|
251
|
+
APOffset minFieldLimit = 0;
|
|
252
|
+
auto valueReshape = [&](s64_t offset)
|
|
253
|
+
{
|
|
254
|
+
if (offset < minFieldLimit)
|
|
255
|
+
{
|
|
256
|
+
return minFieldLimit;
|
|
257
|
+
}
|
|
258
|
+
else if (offset > maxFieldLimit)
|
|
259
|
+
{
|
|
260
|
+
return maxFieldLimit;
|
|
261
|
+
}
|
|
262
|
+
else
|
|
263
|
+
{
|
|
264
|
+
return offset;
|
|
265
|
+
}
|
|
266
|
+
};
|
|
235
267
|
/// offset is constant but stored in variable
|
|
236
268
|
if (op)
|
|
237
269
|
{
|
|
238
|
-
offsetLb = offsetUb = op->getSExtValue()
|
|
239
|
-
maxFieldLimit? maxFieldLimit: op->getSExtValue();
|
|
270
|
+
offsetLb = offsetUb = valueReshape(op->getSExtValue());
|
|
240
271
|
}
|
|
241
272
|
else
|
|
242
273
|
{
|
|
@@ -244,27 +275,16 @@ std::pair<s32_t, s32_t> SVFIR2ItvExeState::getIndexfromGepTypePair(const AccessP
|
|
|
244
275
|
//if (!inVarToIValTable(idx)) return std::make_pair(-1, -1);
|
|
245
276
|
IntervalValue &idxVal = _es[idx];
|
|
246
277
|
if (idxVal.isBottom() || idxVal.isTop())
|
|
247
|
-
return std::make_pair(0,
|
|
278
|
+
return std::make_pair(0, Options::MaxFieldLimit());
|
|
248
279
|
// if idxVal is a concrete value
|
|
249
280
|
if (idxVal.is_numeral())
|
|
250
281
|
{
|
|
251
|
-
offsetLb = offsetUb = idxVal.lb().getNumeral()
|
|
252
|
-
maxFieldLimit? maxFieldLimit: idxVal.lb().getNumeral();
|
|
282
|
+
offsetLb = offsetUb = valueReshape(idxVal.lb().getNumeral());
|
|
253
283
|
}
|
|
254
284
|
else
|
|
255
285
|
{
|
|
256
|
-
offsetLb = idxVal.lb().getNumeral()
|
|
257
|
-
|
|
258
|
-
: idxVal.lb().getNumeral();
|
|
259
|
-
offsetLb = idxVal.lb().getNumeral() > maxFieldLimit
|
|
260
|
-
? maxFieldLimit
|
|
261
|
-
: offsetLb;
|
|
262
|
-
offsetUb = idxVal.ub().getNumeral() < 0
|
|
263
|
-
? 0
|
|
264
|
-
: idxVal.ub().getNumeral();
|
|
265
|
-
offsetUb = idxVal.ub().getNumeral() > maxFieldLimit
|
|
266
|
-
? maxFieldLimit
|
|
267
|
-
: offsetUb;
|
|
286
|
+
offsetLb = valueReshape(idxVal.lb().getNumeral());
|
|
287
|
+
offsetUb = valueReshape(idxVal.ub().getNumeral());
|
|
268
288
|
}
|
|
269
289
|
}
|
|
270
290
|
|
|
@@ -280,8 +300,8 @@ std::pair<s32_t, s32_t> SVFIR2ItvExeState::getIndexfromGepTypePair(const AccessP
|
|
|
280
300
|
const std::vector<u32_t>& so = SymbolTableInfo::SymbolInfo()
|
|
281
301
|
->getTypeInfo(type)
|
|
282
302
|
->getFlattenedElemIdxVec();
|
|
283
|
-
if (so.empty() ||
|
|
284
|
-
|
|
303
|
+
if (so.empty() || offsetUb >= (APOffset)so.size() ||
|
|
304
|
+
offsetLb >= (APOffset)so.size())
|
|
285
305
|
{
|
|
286
306
|
offsetLb = 0;
|
|
287
307
|
offsetUb = maxFieldLimit;
|
|
@@ -301,26 +321,26 @@ std::pair<s32_t, s32_t> SVFIR2ItvExeState::getIndexfromGepTypePair(const AccessP
|
|
|
301
321
|
}
|
|
302
322
|
|
|
303
323
|
|
|
304
|
-
std::pair<
|
|
324
|
+
std::pair<APOffset, APOffset> SVFIR2ItvExeState::getGepByteOffset(const GepStmt *gep, APOffset elemBytesize)
|
|
305
325
|
{
|
|
306
326
|
/// for instant constant index, e.g. gep arr, 1
|
|
307
327
|
if (gep->getOffsetVarAndGepTypePairVec().empty())
|
|
308
328
|
return std::make_pair(gep->getConstantFieldIdx(), gep->getConstantFieldIdx());
|
|
309
|
-
|
|
310
|
-
|
|
329
|
+
APOffset totalOffsetLb = 0;
|
|
330
|
+
APOffset totalOffsetUb = 0;
|
|
311
331
|
/// default value of MaxFieldLimit is 512
|
|
312
|
-
|
|
332
|
+
APOffset maxFieldLimit = 0xFFFFFF;
|
|
313
333
|
for (int i = gep->getOffsetVarAndGepTypePairVec().size() - 1; i >= 0; i--)
|
|
314
334
|
{
|
|
315
|
-
std::pair<
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
if (
|
|
335
|
+
std::pair<APOffset, APOffset> offsetIdx = getBytefromGepTypePair(
|
|
336
|
+
gep->getOffsetVarAndGepTypePairVec()[i], gep, elemBytesize);
|
|
337
|
+
APOffset offsetLb = offsetIdx.first;
|
|
338
|
+
APOffset offsetUb = offsetIdx.second;
|
|
339
|
+
if (totalOffsetLb + offsetLb > maxFieldLimit)
|
|
320
340
|
totalOffsetLb = maxFieldLimit;
|
|
321
341
|
else
|
|
322
342
|
totalOffsetLb += offsetLb;
|
|
323
|
-
if (
|
|
343
|
+
if (totalOffsetUb + offsetUb > maxFieldLimit)
|
|
324
344
|
totalOffsetUb = maxFieldLimit;
|
|
325
345
|
else
|
|
326
346
|
totalOffsetUb += offsetUb ;
|
|
@@ -329,21 +349,21 @@ std::pair<s32_t, s32_t> SVFIR2ItvExeState::getGepByteOffset(const GepStmt *gep,
|
|
|
329
349
|
}
|
|
330
350
|
|
|
331
351
|
|
|
332
|
-
std::pair<
|
|
352
|
+
std::pair<APOffset, APOffset> SVFIR2ItvExeState::getGepOffset(const GepStmt *gep)
|
|
333
353
|
{
|
|
334
354
|
/// for instant constant index, e.g. gep arr, 1
|
|
335
355
|
if (gep->getOffsetVarAndGepTypePairVec().empty())
|
|
336
356
|
return std::make_pair(gep->getConstantFieldIdx(), gep->getConstantFieldIdx());
|
|
337
|
-
|
|
338
|
-
|
|
357
|
+
APOffset totalOffsetLb = 0;
|
|
358
|
+
APOffset totalOffsetUb = 0;
|
|
339
359
|
/// default value of MaxFieldLimit is 512
|
|
340
|
-
|
|
360
|
+
APOffset maxFieldLimit = Options::MaxFieldLimit() - 1;
|
|
341
361
|
for (int i = gep->getOffsetVarAndGepTypePairVec().size() - 1; i >= 0; i--)
|
|
342
362
|
{
|
|
343
|
-
std::pair<
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
363
|
+
std::pair<APOffset, APOffset> offsetIdx = getIndexfromGepTypePair(
|
|
364
|
+
gep->getOffsetVarAndGepTypePairVec()[i], gep);
|
|
365
|
+
APOffset offsetLb = offsetIdx.first;
|
|
366
|
+
APOffset offsetUb = offsetIdx.second;
|
|
347
367
|
if ((long long) (totalOffsetLb + offsetLb) > maxFieldLimit)
|
|
348
368
|
totalOffsetLb = maxFieldLimit;
|
|
349
369
|
else
|
|
@@ -842,7 +862,7 @@ void SVFIR2ItvExeState::translateGep(const GepStmt *gep)
|
|
|
842
862
|
assert(!getVAddrs(rhs).empty());
|
|
843
863
|
VAddrs &rhsVal = getVAddrs(rhs);
|
|
844
864
|
if (rhsVal.empty()) return;
|
|
845
|
-
std::pair<
|
|
865
|
+
std::pair<APOffset, APOffset> offsetPair = getGepOffset(gep);
|
|
846
866
|
if (offsetPair.first == -1 && offsetPair.second == -1) return;
|
|
847
867
|
if (!isVirtualMemAddress(*rhsVal.begin()))
|
|
848
868
|
{
|
|
@@ -851,12 +871,12 @@ void SVFIR2ItvExeState::translateGep(const GepStmt *gep)
|
|
|
851
871
|
else
|
|
852
872
|
{
|
|
853
873
|
VAddrs gepAddrs;
|
|
854
|
-
|
|
855
|
-
if (offsetPair.second >
|
|
874
|
+
APOffset ub = offsetPair.second;
|
|
875
|
+
if (offsetPair.second > Options::MaxFieldLimit() - 1)
|
|
856
876
|
{
|
|
857
877
|
ub = Options::MaxFieldLimit() - 1;
|
|
858
878
|
}
|
|
859
|
-
for (
|
|
879
|
+
for (APOffset i = offsetPair.first; i <= ub; i++)
|
|
860
880
|
{
|
|
861
881
|
gepAddrs.join_with(getGepObjAddress(rhs, i));
|
|
862
882
|
}
|