svf-tools 1.0.604 → 1.0.606

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 (136) hide show
  1. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +2 -2
  2. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +1 -1
  3. package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +1 -1
  4. package/SVF-doxygen/html/html/CFLStat_8cpp_source.html +1 -1
  5. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +1 -1
  6. package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +1 -1
  7. package/SVF-doxygen/html/html/CSC_8cpp_source.html +1 -1
  8. package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +1 -1
  9. package/SVF-doxygen/html/html/Casting_8h.html +3 -0
  10. package/SVF-doxygen/html/html/Casting_8h_source.html +22 -22
  11. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +1 -1
  12. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +15 -15
  13. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +3 -3
  14. package/SVF-doxygen/html/html/DCHG_8cpp_source.html +1 -1
  15. package/SVF-doxygen/html/html/DCHG_8h_source.html +1 -1
  16. package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
  17. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +82 -74
  18. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +14 -14
  19. package/SVF-doxygen/html/html/FlowDDA_8h_source.html +9 -9
  20. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +1 -1
  21. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +27 -21
  22. package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +18 -18
  23. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +1 -1
  24. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +2 -2
  25. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +2 -2
  26. package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +1 -1
  27. package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +2 -2
  28. package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +1 -1
  29. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +1 -1
  30. package/SVF-doxygen/html/html/MHP_8cpp_source.html +33 -38
  31. package/SVF-doxygen/html/html/MHP_8h_source.html +22 -22
  32. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +1 -1
  33. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +3 -3
  34. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +1 -1
  35. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +1 -1
  36. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +1 -1
  37. package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +12 -11
  38. package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +11 -11
  39. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +2 -2
  40. package/SVF-doxygen/html/html/SVFValue_8h_source.html +1 -1
  41. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +1 -1
  42. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +8 -1
  43. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +11 -11
  44. package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +8 -8
  45. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +1 -1
  46. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +1 -1
  47. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +1 -1
  48. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +2 -2
  49. package/SVF-doxygen/html/html/classSVF_1_1AliasCFLGraphBuilder.html +2 -2
  50. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +1 -1
  51. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +2 -2
  52. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +5 -5
  53. package/SVF-doxygen/html/html/classSVF_1_1CFLStat.html +1 -1
  54. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +2 -2
  55. package/SVF-doxygen/html/html/classSVF_1_1CSC.html +1 -1
  56. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +1 -1
  57. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +2 -2
  58. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +19 -19
  59. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +11 -11
  60. package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
  61. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +228 -220
  62. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +2 -2
  63. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +17 -17
  64. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +64 -58
  65. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +1 -1
  66. package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +30 -38
  67. package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +1 -1
  68. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +3 -3
  69. package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +2 -2
  70. package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +1 -1
  71. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +2 -2
  72. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +67 -83
  73. package/SVF-doxygen/html/html/classSVF_1_1MHPValidator.html +1 -1
  74. package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +1 -1
  75. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +4 -4
  76. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +53 -53
  77. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +3 -3
  78. package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +1 -1
  79. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +1 -1
  80. package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +5 -5
  81. package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst.html +1 -1
  82. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +46 -33
  83. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +4 -4
  84. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +1 -1
  85. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +8 -1
  86. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +32 -32
  87. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +3 -3
  88. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +1 -1
  89. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +1 -1
  90. package/SVF-doxygen/html/html/classSVF_1_1VFCFLGraphBuilder.html +1 -1
  91. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +4 -4
  92. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive_1_1SCC.html +1 -1
  93. package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +2 -2
  94. package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +7 -7
  95. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +50 -17
  96. package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +2 -2
  97. package/SVF-doxygen/html/html/namespacemembers_func_i.html +7 -7
  98. package/SVF-doxygen/html/html/namespacemembers_i.html +8 -8
  99. package/SVF-doxygen/html/html/search/all_9.js +1 -1
  100. package/SVF-doxygen/html/html/search/functions_8.js +1 -1
  101. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__convert__val.html +3 -3
  102. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html +3 -3
  103. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty.html +2 -2
  104. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl.html +2 -2
  105. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html +2 -2
  106. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html +2 -2
  107. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html +2 -2
  108. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html +2 -2
  109. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html +4 -4
  110. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__wrap.html +2 -2
  111. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html +2 -2
  112. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__simple__type.html +2 -2
  113. package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +1 -1
  114. package/include/DDA/DDAVFSolver.h +4 -8
  115. package/include/Graphs/SVFGOPT.h +2 -2
  116. package/include/MTA/MTAResultValidator.h +1 -1
  117. package/include/Util/Casting.h +7 -0
  118. package/lib/CFL/CFLStat.cpp +1 -1
  119. package/lib/DDA/ContextDDA.cpp +1 -1
  120. package/lib/Graphs/ConsG.cpp +2 -2
  121. package/lib/Graphs/SVFGOPT.cpp +15 -17
  122. package/lib/MTA/FSMPTA.cpp +7 -6
  123. package/lib/MTA/LockAnalysis.cpp +1 -1
  124. package/lib/MTA/MHP.cpp +216 -229
  125. package/lib/MemoryModel/LocationSet.cpp +1 -1
  126. package/lib/MemoryModel/PointerAnalysis.cpp +1 -1
  127. package/lib/SABER/SaberSVFGBuilder.cpp +1 -1
  128. package/lib/SABER/SrcSnkDDA.cpp +3 -3
  129. package/lib/SVF-LLVM/LLVMModule.cpp +1 -1
  130. package/lib/SVF-LLVM/LLVMUtil.cpp +1 -1
  131. package/lib/SVF-LLVM/SVFIRBuilder.cpp +4 -4
  132. package/lib/SVF-LLVM/SymbolTableBuilder.cpp +3 -2
  133. package/lib/SVFIR/SymbolTableInfo.cpp +1 -1
  134. package/lib/WPA/AndersenSFR.cpp +1 -1
  135. package/lib/WPA/FlowSensitive.cpp +23 -22
  136. package/package.json +1 -1
@@ -66,7 +66,7 @@ $(function() {
66
66
  <div class="title">MTAResultValidator.h</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="include_2MTA_2MTAResultValidator_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * MTAResultValidator.h</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * Created on: 29/06/2015</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * Author: Peng Di and Ding Ye</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#ifndef MTARESULTVALIDATOR_H_</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#define MTARESULTVALIDATOR_H_</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="MHP_8h.html">MTA/MHP.h</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LLVMUtil_8h.html">SVF-LLVM/LLVMUtil.h</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;{</div><div class="line"><a name="l00020"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc"> 20</a></span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a>;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html"> 22</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1MTAResultValidator.html">MTAResultValidator</a></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;{</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a8e26b7fe85478eef7b3d0551ab59d9c7"> 26</a></span>&#160; <span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a8e26b7fe85478eef7b3d0551ab59d9c7">INTERLEV_FLAG</a>;</div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#af7f90c7a146c085d3b432ab40fb3777e"> 27</a></span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#af7f90c7a146c085d3b432ab40fb3777e">MTAResultValidator</a>(<a class="code" href="classSVF_1_1MHP.html">MHP</a>* mh) :</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a>(mh)</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#a08d80c69c8cd11222233e0e88a41f58d">tcg</a> = <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a>-&gt;<a class="code" href="classSVF_1_1MHP.html#a20e740d4b96ef086b6b5778acd38ca88">getThreadCallGraph</a>();</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#a3539af55e9ba2343e576f7e14f42994f">tdAPI</a> = <a class="code" href="classSVF_1_1MTAResultValidator.html#a08d80c69c8cd11222233e0e88a41f58d">tcg</a>-&gt;<a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>();</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#a5a0f25f5718d84f251331a2e2d207108">mod</a> = <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a>-&gt;<a class="code" href="classSVF_1_1MHP.html#a033936547612c54326a604f0ff1e39a6">getTCT</a>()-&gt;<a class="code" href="classSVF_1_1TCT.html#aabc2c84e951ed9ae64207e379acb3074">getSVFModule</a>();</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; }</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="comment">// Destructor</span></div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#afd9f0901b8474c35011eeb57e9bd15e9"> 35</a></span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#afd9f0901b8474c35011eeb57e9bd15e9">~MTAResultValidator</a>()</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; {</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; }</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="comment">// Analysis</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a462f1554e058b656861abfb0aa2e47ff">analyze</a>();</div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#aecaf875c6c88f7ba6fa45540e8436f57"> 41</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#aecaf875c6c88f7ba6fa45540e8436f57">getModule</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a5a0f25f5718d84f251331a2e2d207108">mod</a>;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; }</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment"> * Assistant functions</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="comment">// Split string</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; std::vector&lt;std::string&gt; &amp;<a class="code" href="classSVF_1_1MTAResultValidator.html#a73db9ad234b263b6e644e4b38be14fe6">split</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;s, <span class="keywordtype">char</span> delim, std::vector&lt;std::string&gt; &amp;elems);</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; std::vector&lt;std::string&gt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a73db9ad234b263b6e644e4b38be14fe6">split</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;s, <span class="keywordtype">char</span> delim);</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="comment">// Get special arguments of given call sites</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; NodeID <a class="code" href="classSVF_1_1MTAResultValidator.html#ac61547c85523592e8a61bbb2a1cd61f0">getIntArg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> arg_num);</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; std::vector&lt;std::string&gt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a1ac51d2847f9bdee27092ab22211bb61">getStringArg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> arg_num);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#afb110fec926967ba334bf2635d58a339">getCxtArg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> arg_num);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="comment"> * Get the previous LoadInst or StoreInst from Instruction &quot;I&quot; in the</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="comment"> * same BasicBlock. Return nullptr if none exists.</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#ab3ba3c6d9c40e97febdab0e7d4ad9a3e">getPreviousMemoryAccessInst</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I);</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="comment">// Compare two cxts</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a6306899b5360e106dd090bea571027bf">matchCxt</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt2) <span class="keyword">const</span>;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="comment">// Dump calling context information</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#ae7d61becd14123f60976fd7261d0c84d">dumpCxt</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>&amp; cxt) <span class="keyword">const</span>;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a1af033b5742fa9cc1e4f9873184775b7">dumpInterlev</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; lev);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">// Get the validation result string of a single validation scenario.</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keyword">inline</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *scenario, <span class="keywordtype">bool</span> analysisRes);</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">inline</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#ac24a8a6922d9dc9edecab3bc45bc9204">getOutputforInterlevAnalysis</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *scenario, INTERLEV_FLAG analysisRes);</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="comment"> * Collect the callsite targets for validations.</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<span class="comment"> * The targets are labeled by &quot;cs1:&quot;, &quot;cs2:&quot;... that are the names of its basic blocks.</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;<span class="comment"> * The collected targets are stored in csnumToInstMap that maps label &quot;cs1&quot; to its Callsite.</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a1fc4116b134aa87420d055b193208e68">collectCallsiteTargets</a>();</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="comment"> * Collect the CxtThread targets for validations.</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="comment"> * The collected targets are stored in vthdToCxt that maps vthd to cxt.</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a430c03371b2b5b7300c5c3a68d633909">collectCxtThreadTargets</a>();</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="comment"> * Collect TCT targets for validations.</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="comment"> * The collected targets are stored in rthdToChildren.</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#abdf31e8fca824b56a53788de525042a6">collectTCTTargets</a>();</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="comment"> * Collect the thread interleaving targets for validations.</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="comment"> * The collected targets are stored in instToTSMap and threadStmtToInterLeaving.</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a3c3eacff786230d093d27615ff360ed4">collectInterleavingTargets</a>();</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;<span class="comment"> * Perform validation for Cxtthread.</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;<span class="comment"> * If correct, the validator maps given thread vthd to static CxtThread rthd stored in vthdTorthd.</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#afa01b108b67ec2ac05a6444b55dbfe01">validateCxtThread</a>();</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;<span class="comment"> * Perform validation for TCT.</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#ae6a18cbaf113ee8e28c3e8dca458d4be">validateTCT</a>();</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;<span class="comment"> * Perform validation for thread interleaving.</span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; INTERLEV_FLAG <a class="code" href="classSVF_1_1MTAResultValidator.html#a373b5227fbfa82ac070f55db999afb28">validateInterleaving</a>();</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a432fa7a1a9af82c90583c779e8f63cf4"> 121</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, const SVFInstruction*&gt;</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a432fa7a1a9af82c90583c779e8f63cf4">csnumToInst</a>;</div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a1392757f98b54057d33adb125fd48efa"> 122</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, CallStrCxt&gt;</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a1392757f98b54057d33adb125fd48efa">vthdToCxtMap</a>;</div><div class="line"><a name="l00123"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a7fc576e83fa259d0ab06d54c3537c4ac"> 123</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, NodeID&gt;</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a7fc576e83fa259d0ab06d54c3537c4ac">vthdTorthdMap</a>;</div><div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#ab386260dd6bbaeacde10e5c81f07502c"> 124</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, NodeID&gt;</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#ab386260dd6bbaeacde10e5c81f07502c">rthdTovthdMap</a>;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;</div><div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a7d2043cf3c354812fa5e4cdf7f60ff20"> 126</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Set&lt;NodeID&gt;</a>&gt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a7d2043cf3c354812fa5e4cdf7f60ff20">rthdToChildrenMap</a>;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a8452bf182f6f1e0f4c239f620ee803b1"> 128</a></span>&#160; <a class="code" href="classSVF_1_1MHP.html#aaea1d121f1623e1af7e717cbbb8a0146">MHP::InstToThreadStmtSetMap</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a8452bf182f6f1e0f4c239f620ee803b1">instToTSMap</a>; <span class="comment">// Map a instruction to CxtThreadStmtSet</span></div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#ac4a7773211a9c842639ac25b1a504c7e"> 129</a></span>&#160; <a class="code" href="classSVF_1_1MHP.html#ac30f283cb2ad020a054ee6525ca94025">MHP::ThreadStmtToThreadInterleav</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#ac4a7773211a9c842639ac25b1a504c7e">threadStmtToInterLeaving</a>; </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;</div><div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#aaab9574a6688d2d47d155eb5e79938c3"> 131</a></span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">char</span> <span class="keyword">const</span> *<a class="code" href="classSVF_1_1MTAResultValidator.html#aaab9574a6688d2d47d155eb5e79938c3">CXT_THREAD</a> = <span class="stringliteral">&quot;CXT_THREAD&quot;</span>;</div><div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a135078b706631608a0400e7b6535aa01"> 132</a></span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">char</span> <span class="keyword">const</span> *<a class="code" href="classSVF_1_1MTAResultValidator.html#a135078b706631608a0400e7b6535aa01">INTERLEV_ACCESS</a> = <span class="stringliteral">&quot;INTERLEV_ACCESS&quot;</span>;</div><div class="line"><a name="l00133"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#ac8f933e04f7633cfb56b3e33ee2d6808"> 133</a></span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">char</span> <span class="keyword">const</span> *<a class="code" href="classSVF_1_1MTAResultValidator.html#ac8f933e04f7633cfb56b3e33ee2d6808">TCT_ACCESS</a> = <span class="stringliteral">&quot;TCT_ACCESS&quot;</span>;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a3539af55e9ba2343e576f7e14f42994f"> 135</a></span>&#160; <a class="code" href="classSVF_1_1ThreadAPI.html">ThreadAPI</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#a3539af55e9ba2343e576f7e14f42994f">tdAPI</a>;</div><div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a08d80c69c8cd11222233e0e88a41f58d"> 136</a></span>&#160; <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#a08d80c69c8cd11222233e0e88a41f58d">tcg</a>;</div><div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18"> 137</a></span>&#160; <a class="code" href="classSVF_1_1MHP.html">MHP</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a>;</div><div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a245c967245e5a693eaf7f60782143d7a"> 138</a></span>&#160; vthdToCxtMap <a class="code" href="classSVF_1_1MTAResultValidator.html#a245c967245e5a693eaf7f60782143d7a">vthdToCxt</a>;</div><div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a7382b2759b01b8382c5e59b21e7e262a"> 139</a></span>&#160; vthdTorthdMap <a class="code" href="classSVF_1_1MTAResultValidator.html#a7382b2759b01b8382c5e59b21e7e262a">vthdTorthd</a>;</div><div class="line"><a name="l00140"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a615623a08324ee155cb527a3b57e8c19"> 140</a></span>&#160; rthdTovthdMap <a class="code" href="classSVF_1_1MTAResultValidator.html#a615623a08324ee155cb527a3b57e8c19">rthdTovthd</a>;</div><div class="line"><a name="l00141"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#ae2717c467dc7c49fab0ec93bfa4baaab"> 141</a></span>&#160; csnumToInst <a class="code" href="classSVF_1_1MTAResultValidator.html#ae2717c467dc7c49fab0ec93bfa4baaab">csnumToInstMap</a>;</div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a542f2f41c90698270687fc7858a26555"> 142</a></span>&#160; rthdToChildrenMap <a class="code" href="classSVF_1_1MTAResultValidator.html#a542f2f41c90698270687fc7858a26555">rthdToChildren</a>;</div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a5a0f25f5718d84f251331a2e2d207108"> 143</a></span>&#160; <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#a5a0f25f5718d84f251331a2e2d207108">mod</a>;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a5a6e2f2d1d6aa6fb3a83455b5a288ff1"> 146</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> INTERLEV_FLAG <a class="code" href="classSVF_1_1MTAResultValidator.html#a5a6e2f2d1d6aa6fb3a83455b5a288ff1">INTERLEV_TRUE</a> = 0x01;</div><div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a80414f4ba70357742fa0269f93f1a910"> 147</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> INTERLEV_FLAG <a class="code" href="classSVF_1_1MTAResultValidator.html#a80414f4ba70357742fa0269f93f1a910">INTERLEV_IMPRECISE</a> = 0x02;</div><div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a0e2fb93a69df487606c0eeaeadab805d"> 148</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> INTERLEV_FLAG <a class="code" href="classSVF_1_1MTAResultValidator.html#a0e2fb93a69df487606c0eeaeadab805d">INTERLEV_UNSOUND</a> = 0x04;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;};</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html"> 169</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1RaceResultValidator.html">RaceResultValidator</a></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;{</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ac57ae430ee5b6868fe810172ec658853"> 172</a></span>&#160; <span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#ac57ae430ee5b6868fe810172ec658853">RC_FLAG</a>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html"> 177</a></span>&#160; <span class="keyword">class </span><a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html">AccessPair</a></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; {</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a7dd2f8afab59ee4d107a6bfdb6c151ea"> 181</a></span>&#160; <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a7dd2f8afab59ee4d107a6bfdb6c151ea">AccessPair</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2,</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keyword">const</span> RC_FLAG flags) :</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; I1(I1), I2(I2), flags(flags)</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; {</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; }</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;</div><div class="line"><a name="l00189"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1"> 189</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(<span class="keyword">const</span> RC_FLAG flag)<span class="keyword"> const</span></div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">return</span> flags &amp; flag;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; }</div><div class="line"><a name="l00193"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a97307972daebc1fc358ba2c8009c5990"> 193</a></span>&#160; <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a97307972daebc1fc358ba2c8009c5990">getInstruction1</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">return</span> I1;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; }</div><div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#acf383712e9399fec0d52614b2338836c"> 197</a></span>&#160; <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#acf383712e9399fec0d52614b2338836c">getInstruction2</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keywordflow">return</span> I2;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a2f6817c4f04b090ff8ebff68cafa5892"> 204</a></span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a2f6817c4f04b090ff8ebff68cafa5892">I1</a>;</div><div class="line"><a name="l00205"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a4759b40288c232686465893d988697f3"> 205</a></span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a4759b40288c232686465893d988697f3">I2</a>;</div><div class="line"><a name="l00206"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#aafb0a0cd068e1632f0d643233cad8ad9"> 206</a></span>&#160; RC_FLAG <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#aafb0a0cd068e1632f0d643233cad8ad9">flags</a>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; };</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;</div><div class="line"><a name="l00210"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a8f0d25327d5365f6ae229723aa5d6ff7"> 210</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a8f0d25327d5365f6ae229723aa5d6ff7">~RaceResultValidator</a>()</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; {</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; release();</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7"> 216</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7">init</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* M)</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; {</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; this-&gt;M = M;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; selectedValidationScenarios = RC_MHP | RC_ALIASES | RC_PROTECTED | RC_RACE;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; collectValidationTargets();</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; }</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ab8a261120a7f6520d22a6f5cdf2257e9"> 224</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#ab8a261120a7f6520d22a6f5cdf2257e9">analyze</a>()</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; validateAll();</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; }</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;</div><div class="line"><a name="l00230"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a64f61b58f59eba5f3e7c69f90edc68df"> 230</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a64f61b58f59eba5f3e7c69f90edc68df">release</a>()</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; {</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; }</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a749793355ab8390a1e6577d7b05efddf"> 235</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a749793355ab8390a1e6577d7b05efddf">hasValidationTarget</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">return</span> !accessPairs.empty();</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ade9f150c970aa2cc481c878aebf71662"> 244</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#ade9f150c970aa2cc481c878aebf71662">mayAccessAliases</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1,</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2)</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; {</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; selectedValidationScenarios &amp;= ~RC_ALIASES;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; }</div><div class="line"><a name="l00250"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aff51b56e5f7173dd8ac053e5d9b1e97d"> 250</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#aff51b56e5f7173dd8ac053e5d9b1e97d">mayHappenInParallel</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1,</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; selectedValidationScenarios &amp;= ~RC_MHP;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; }</div><div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aeb24aa510c7073ef71062e89a11fe00a"> 256</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#aeb24aa510c7073ef71062e89a11fe00a">protectedByCommonLocks</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1,</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; selectedValidationScenarios &amp;= ~RC_PROTECTED;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; }</div><div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a1df6b00752e373ac7bf08a2cae0b9641"> 262</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a1df6b00752e373ac7bf08a2cae0b9641">mayHaveDataRace</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1,</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2)</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; {</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; selectedValidationScenarios &amp;= ~RC_RACE;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; }</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#adb3030fc7514506e2592e11898217375"> 275</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#adb3030fc7514506e2592e11898217375">collectValidationTargets</a>()</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; {</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">// Collect call sites of all RC_ACCESS function calls.</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; std::vector&lt;const CallBase*&gt; csInsts;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* F = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &amp;M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;getLLVMModules())</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; {</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> it = M.begin(); it != M.end(); it++)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> fName = (*it).getName().str();</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">if</span>(fName.find(RC_ACCESS) != std::string::npos)</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; F = &amp;(*it);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; }</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; }</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keywordflow">if</span> (!F) <span class="keywordflow">return</span>;</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordflow">for</span> (Value::const_use_iterator it = F-&gt;use_begin(), ie =</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; F-&gt;use_end(); it != ie; ++it)</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; {</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a334998718813a19a7697daf4ba282faf">Use</a> *u = &amp;*it;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *user = u-&gt;getUser();</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a5a7dc8680a9714e08b01dd339b85bb20">LLVMUtil::isCallSite</a>(user))</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; {</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* csInst = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a0095d23a9c9d5d62ec4a23c56824b5f0">LLVMUtil::getLLVMCallSite</a>(user);</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; csInsts.push_back(csInst);</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; }</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; assert(csInsts.size() % 2 == 0 &amp;&amp; <span class="stringliteral">&quot;We should have RC_ACCESS called in pairs.&quot;</span>);</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="comment">// Sort the validation sites according to their ids.</span></div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; std::sort(csInsts.begin(), csInsts.end(), compare);</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="comment">// Generate access pairs.</span></div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0, e = csInsts.size(); i != e;)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* CI1 = csInsts[i++];</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* CI2 = csInsts[i++];</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* C = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>&gt;(CI1-&gt;getArgOperand(1));</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; assert(C);</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1 = <a class="code" href="classSVF_1_1MTAResultValidator.html#ab3ba3c6d9c40e97febdab0e7d4ad9a3e">getPreviousMemoryAccessInst</a>(CI1);</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2 = <a class="code" href="classSVF_1_1MTAResultValidator.html#ab3ba3c6d9c40e97febdab0e7d4ad9a3e">getPreviousMemoryAccessInst</a>(CI2);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; assert(I1 &amp;&amp; I2 &amp;&amp; <span class="stringliteral">&quot;RC_ACCESS should be placed immediately after the target memory access.&quot;</span>);</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; RC_FLAG flags = C-&gt;getZExtValue();</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; accessPairs.push_back(<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html">AccessPair</a>(I1, I2, flags));</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; }</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; }</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;</div><div class="line"><a name="l00326"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a58e07fcd0d9a611dfd31ab62802c5990"> 326</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a58e07fcd0d9a611dfd31ab62802c5990">validateAll</a>()</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; {</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot; --- Analysis Result Validation ---\n&quot;</span>);</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="comment">// Iterate every memory access pair to perform the validation.</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0, e = accessPairs.size(); i != e; ++i)</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html">AccessPair</a> &amp;ap = accessPairs[i];</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1 = ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a97307972daebc1fc358ba2c8009c5990">getInstruction1</a>();</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2 = ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#acf383712e9399fec0d52614b2338836c">getInstruction2</a>();</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a> = mayHappenInParallel(I1, I2);</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="keywordtype">bool</span> alias = mayAccessAliases(I1, I2);</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keywordtype">bool</span> protect = protectedByCommonLocks(I1, I2);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordtype">bool</span> racy = mayHaveDataRace(I1, I2);</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;For the memory access pair at (&quot;</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(I1)-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a7effb0f37f486745e0cdc3ae5e9c732b">getSourceLoc</a>() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(I2)-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a7effb0f37f486745e0cdc3ae5e9c732b">getSourceLoc</a>() &lt;&lt; <span class="stringliteral">&quot;)\n&quot;</span>;</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">if</span> (selectedValidationScenarios &amp; RC_ALIASES)</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="stringliteral">&quot;ALIASES&quot;</span>, alias, ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(RC_ALIASES))</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keywordflow">if</span> (selectedValidationScenarios &amp; RC_MHP)</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; {</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="stringliteral">&quot;MHP&quot;</span>, mhp, ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(RC_MHP)) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; }</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">if</span> (selectedValidationScenarios &amp; RC_PROTECTED)</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; {</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="stringliteral">&quot;PROTECT&quot;</span>, protect,</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(RC_PROTECTED)) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; }</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">if</span> (selectedValidationScenarios &amp; RC_RACE)</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; {</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="stringliteral">&quot;RACE&quot;</span>, racy, ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(RC_RACE))</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; }</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; }</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; }</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160;</div><div class="line"><a name="l00374"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#afdd89e26a7c168762bfe85746252827f"> 374</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1RaceResultValidator.html#afdd89e26a7c168762bfe85746252827f">getOutput</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *scenario,</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keywordtype">bool</span> analysisRes, <span class="keywordtype">bool</span> expectedRes)</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; {</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> ret(scenario);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; ret += <span class="stringliteral">&quot;\t&quot;</span>;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">if</span> (expectedRes)</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; ret += <span class="stringliteral">&quot; T: &quot;</span>;</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; ret += <span class="stringliteral">&quot; F: &quot;</span>;</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">if</span> (analysisRes == expectedRes)</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; ret += <a class="code" href="namespaceSVF_1_1SVFUtil.html#a6a55f1f8598998a3ffbbc67d32eaf8c4">SVFUtil::sucMsg</a>(<span class="stringliteral">&quot;SUCCESS&quot;</span>);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; ret += <a class="code" href="namespaceSVF_1_1SVFUtil.html#a5d4bb92f5df30417f414397f8e58cf01">SVFUtil::errMsg</a>(<span class="stringliteral">&quot;FAILURE&quot;</span>);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; }</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00391"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aedc9ec6c3db947fa7e1ef50fbb61e9a8"> 391</a></span>&#160; <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1RaceResultValidator.html#aedc9ec6c3db947fa7e1ef50fbb61e9a8">M</a>;</div><div class="line"><a name="l00392"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a90f7d527816acf808e3e54c2a4ed0532"> 392</a></span>&#160; std::vector&lt;AccessPair&gt; <a class="code" href="classSVF_1_1RaceResultValidator.html#a90f7d527816acf808e3e54c2a4ed0532">accessPairs</a>;</div><div class="line"><a name="l00393"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a1294cb90b073ba25a8ffc06180c09419"> 393</a></span>&#160; RC_FLAG <a class="code" href="classSVF_1_1RaceResultValidator.html#a1294cb90b073ba25a8ffc06180c09419">selectedValidationScenarios</a>;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00399"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a2fbfa7dffd33fa23fdddc60b94af8467"> 399</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a2fbfa7dffd33fa23fdddc60b94af8467">compare</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* CI1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* CI2)</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; {</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *V1 = CI1-&gt;getArgOperand(0);</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *V2 = CI2-&gt;getArgOperand(0);</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* C1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>&gt;(V1);</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* C2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>&gt;(V2);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; assert(0 != C1 &amp;&amp; 0 != C2);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keywordflow">return</span> C1-&gt;getZExtValue() &lt; C2-&gt;getZExtValue();</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; }</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;</div><div class="line"><a name="l00414"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ad029f7a9a5161191a44d1e841f9d6114"> 414</a></span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator.html#ad029f7a9a5161191a44d1e841f9d6114">getPreviousMemoryAccessInst</a>(</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I)</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; {</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; I = I-&gt;getPrevNode();</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="keywordflow">while</span> (I)</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; {</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;LoadInst&gt;(I) || SVFUtil::isa&lt;StoreInst&gt;(I))</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keywordflow">return</span> I;</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* inst = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(I);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *callee = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(inst))</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; {</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">if</span> (callee-&gt;getName().find(<span class="stringliteral">&quot;llvm.memset&quot;</span>) != std::string::npos)</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">return</span> I;</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160;</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; }</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; I = I-&gt;getPrevNode();</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; }</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; }</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160;</div><div class="line"><a name="l00438"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aa4129053b7248d4e95763f0b41044e4c"> 438</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> RC_FLAG RC_MHP = 0x01;</div><div class="line"><a name="l00439"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a090afdd4eb0d60b2a0408f9b5ea4a30e"> 439</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> RC_FLAG RC_ALIASES = 0x02;</div><div class="line"><a name="l00440"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#abcdd726f56cc2deb6cad72456863fc9b"> 440</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> RC_FLAG RC_PROTECTED = 0x04;</div><div class="line"><a name="l00441"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#abb9eba49d091d292a13478f659a5e53b"> 441</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> RC_FLAG RC_RACE = 0x10;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160;</div><div class="line"><a name="l00446"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ac2523a7320897a144202dc5bdc083507"> 446</a></span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">char</span> <span class="keyword">const</span> *RC_ACCESS = <span class="stringliteral">&quot;RC_ACCESS&quot;</span>;</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160;};</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160;} <span class="comment">// namespace SVF end</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* MTARESULTVALIDATOR_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="classSVF_1_1RaceResultValidator_html_aff51b56e5f7173dd8ac053e5d9b1e97d"><div class="ttname"><a href="classSVF_1_1RaceResultValidator.html#aff51b56e5f7173dd8ac053e5d9b1e97d">SVF::RaceResultValidator::mayHappenInParallel</a></div><div class="ttdeci">virtual bool mayHappenInParallel(const Instruction *I1, const Instruction *I2)</div><div class="ttdef"><b>Definition:</b> <a href="include_2MTA_2MTAResultValidator_8h_source.html#l00250">MTAResultValidator.h:250</a></div></div>
69
+ <a href="include_2MTA_2MTAResultValidator_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * MTAResultValidator.h</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * Created on: 29/06/2015</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * Author: Peng Di and Ding Ye</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#ifndef MTARESULTVALIDATOR_H_</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#define MTARESULTVALIDATOR_H_</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="MHP_8h.html">MTA/MHP.h</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LLVMUtil_8h.html">SVF-LLVM/LLVMUtil.h</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;{</div><div class="line"><a name="l00020"></a><span class="lineno"><a class="line" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc"> 20</a></span>&#160;<span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a>;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html"> 22</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1MTAResultValidator.html">MTAResultValidator</a></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;{</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a8e26b7fe85478eef7b3d0551ab59d9c7"> 26</a></span>&#160; <span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a8e26b7fe85478eef7b3d0551ab59d9c7">INTERLEV_FLAG</a>;</div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#af7f90c7a146c085d3b432ab40fb3777e"> 27</a></span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#af7f90c7a146c085d3b432ab40fb3777e">MTAResultValidator</a>(<a class="code" href="classSVF_1_1MHP.html">MHP</a>* mh) :</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a>(mh)</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#a08d80c69c8cd11222233e0e88a41f58d">tcg</a> = <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a>-&gt;<a class="code" href="classSVF_1_1MHP.html#a20e740d4b96ef086b6b5778acd38ca88">getThreadCallGraph</a>();</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#a3539af55e9ba2343e576f7e14f42994f">tdAPI</a> = <a class="code" href="classSVF_1_1MTAResultValidator.html#a08d80c69c8cd11222233e0e88a41f58d">tcg</a>-&gt;<a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>();</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#a5a0f25f5718d84f251331a2e2d207108">mod</a> = <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a>-&gt;<a class="code" href="classSVF_1_1MHP.html#a033936547612c54326a604f0ff1e39a6">getTCT</a>()-&gt;<a class="code" href="classSVF_1_1TCT.html#aabc2c84e951ed9ae64207e379acb3074">getSVFModule</a>();</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; }</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="comment">// Destructor</span></div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#afd9f0901b8474c35011eeb57e9bd15e9"> 35</a></span>&#160; <a class="code" href="classSVF_1_1MTAResultValidator.html#afd9f0901b8474c35011eeb57e9bd15e9">~MTAResultValidator</a>()</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; {</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; }</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="comment">// Analysis</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a462f1554e058b656861abfb0aa2e47ff">analyze</a>();</div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#aecaf875c6c88f7ba6fa45540e8436f57"> 41</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#aecaf875c6c88f7ba6fa45540e8436f57">getModule</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a5a0f25f5718d84f251331a2e2d207108">mod</a>;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; }</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment"> * Assistant functions</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="comment">// Split string</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; std::vector&lt;std::string&gt; &amp;<a class="code" href="classSVF_1_1MTAResultValidator.html#a73db9ad234b263b6e644e4b38be14fe6">split</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;s, <span class="keywordtype">char</span> delim, std::vector&lt;std::string&gt; &amp;elems);</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; std::vector&lt;std::string&gt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a73db9ad234b263b6e644e4b38be14fe6">split</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &amp;s, <span class="keywordtype">char</span> delim);</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="comment">// Get special arguments of given call sites</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; NodeID <a class="code" href="classSVF_1_1MTAResultValidator.html#ac61547c85523592e8a61bbb2a1cd61f0">getIntArg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> arg_num);</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; std::vector&lt;std::string&gt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a1ac51d2847f9bdee27092ab22211bb61">getStringArg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> arg_num);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#afb110fec926967ba334bf2635d58a339">getCxtArg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> arg_num);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="comment"> * Get the previous LoadInst or StoreInst from Instruction &quot;I&quot; in the</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="comment"> * same BasicBlock. Return nullptr if none exists.</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#ab3ba3c6d9c40e97febdab0e7d4ad9a3e">getPreviousMemoryAccessInst</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I);</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="comment">// Compare two cxts</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a6306899b5360e106dd090bea571027bf">matchCxt</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt2) <span class="keyword">const</span>;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="comment">// Dump calling context information</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#ae7d61becd14123f60976fd7261d0c84d">dumpCxt</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>&amp; cxt) <span class="keyword">const</span>;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a1af033b5742fa9cc1e4f9873184775b7">dumpInterlev</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; lev);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">// Get the validation result string of a single validation scenario.</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keyword">inline</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *scenario, <span class="keywordtype">bool</span> analysisRes);</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keyword">inline</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#ac24a8a6922d9dc9edecab3bc45bc9204">getOutputforInterlevAnalysis</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *scenario, INTERLEV_FLAG analysisRes);</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="comment"> * Collect the callsite targets for validations.</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;<span class="comment"> * The targets are labeled by &quot;cs1:&quot;, &quot;cs2:&quot;... that are the names of its basic blocks.</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;<span class="comment"> * The collected targets are stored in csnumToInstMap that maps label &quot;cs1&quot; to its Callsite.</span></div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a1fc4116b134aa87420d055b193208e68">collectCallsiteTargets</a>();</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160;<span class="comment"> * Collect the CxtThread targets for validations.</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="comment"> * The collected targets are stored in vthdToCxt that maps vthd to cxt.</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a430c03371b2b5b7300c5c3a68d633909">collectCxtThreadTargets</a>();</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;<span class="comment"> * Collect TCT targets for validations.</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160;<span class="comment"> * The collected targets are stored in rthdToChildren.</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#abdf31e8fca824b56a53788de525042a6">collectTCTTargets</a>();</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="comment"> * Collect the thread interleaving targets for validations.</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="comment"> * The collected targets are stored in instToTSMap and threadStmtToInterLeaving.</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a3c3eacff786230d093d27615ff360ed4">collectInterleavingTargets</a>();</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;<span class="comment"> * Perform validation for Cxtthread.</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;<span class="comment"> * If correct, the validator maps given thread vthd to static CxtThread rthd stored in vthdTorthd.</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#afa01b108b67ec2ac05a6444b55dbfe01">validateCxtThread</a>();</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;<span class="comment"> * Perform validation for TCT.</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#ae6a18cbaf113ee8e28c3e8dca458d4be">validateTCT</a>();</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;<span class="comment"> * Perform validation for thread interleaving.</span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; INTERLEV_FLAG <a class="code" href="classSVF_1_1MTAResultValidator.html#a373b5227fbfa82ac070f55db999afb28">validateInterleaving</a>();</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a432fa7a1a9af82c90583c779e8f63cf4"> 121</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, const SVFInstruction*&gt;</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a432fa7a1a9af82c90583c779e8f63cf4">csnumToInst</a>;</div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a1392757f98b54057d33adb125fd48efa"> 122</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, CallStrCxt&gt;</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a1392757f98b54057d33adb125fd48efa">vthdToCxtMap</a>;</div><div class="line"><a name="l00123"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a7fc576e83fa259d0ab06d54c3537c4ac"> 123</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, NodeID&gt;</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a7fc576e83fa259d0ab06d54c3537c4ac">vthdTorthdMap</a>;</div><div class="line"><a name="l00124"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#ab386260dd6bbaeacde10e5c81f07502c"> 124</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, NodeID&gt;</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#ab386260dd6bbaeacde10e5c81f07502c">rthdTovthdMap</a>;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;</div><div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a7d2043cf3c354812fa5e4cdf7f60ff20"> 126</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Set&lt;NodeID&gt;</a>&gt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a7d2043cf3c354812fa5e4cdf7f60ff20">rthdToChildrenMap</a>;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a8452bf182f6f1e0f4c239f620ee803b1"> 128</a></span>&#160; <a class="code" href="classSVF_1_1MHP.html#aaea1d121f1623e1af7e717cbbb8a0146">MHP::InstToThreadStmtSetMap</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#a8452bf182f6f1e0f4c239f620ee803b1">instToTSMap</a>; <span class="comment">// Map a instruction to CxtThreadStmtSet</span></div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#ac4a7773211a9c842639ac25b1a504c7e"> 129</a></span>&#160; <a class="code" href="classSVF_1_1MHP.html#ac30f283cb2ad020a054ee6525ca94025">MHP::ThreadStmtToThreadInterleav</a> <a class="code" href="classSVF_1_1MTAResultValidator.html#ac4a7773211a9c842639ac25b1a504c7e">threadStmtToInterLeaving</a>; </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;</div><div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#aaab9574a6688d2d47d155eb5e79938c3"> 131</a></span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">char</span> <span class="keyword">const</span> *<a class="code" href="classSVF_1_1MTAResultValidator.html#aaab9574a6688d2d47d155eb5e79938c3">CXT_THREAD</a> = <span class="stringliteral">&quot;CXT_THREAD&quot;</span>;</div><div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a135078b706631608a0400e7b6535aa01"> 132</a></span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">char</span> <span class="keyword">const</span> *<a class="code" href="classSVF_1_1MTAResultValidator.html#a135078b706631608a0400e7b6535aa01">INTERLEV_ACCESS</a> = <span class="stringliteral">&quot;INTERLEV_ACCESS&quot;</span>;</div><div class="line"><a name="l00133"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#ac8f933e04f7633cfb56b3e33ee2d6808"> 133</a></span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">char</span> <span class="keyword">const</span> *<a class="code" href="classSVF_1_1MTAResultValidator.html#ac8f933e04f7633cfb56b3e33ee2d6808">TCT_ACCESS</a> = <span class="stringliteral">&quot;TCT_ACCESS&quot;</span>;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;</div><div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a3539af55e9ba2343e576f7e14f42994f"> 135</a></span>&#160; <a class="code" href="classSVF_1_1ThreadAPI.html">ThreadAPI</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#a3539af55e9ba2343e576f7e14f42994f">tdAPI</a>;</div><div class="line"><a name="l00136"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a08d80c69c8cd11222233e0e88a41f58d"> 136</a></span>&#160; <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#a08d80c69c8cd11222233e0e88a41f58d">tcg</a>;</div><div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18"> 137</a></span>&#160; <a class="code" href="classSVF_1_1MHP.html">MHP</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a>;</div><div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a245c967245e5a693eaf7f60782143d7a"> 138</a></span>&#160; vthdToCxtMap <a class="code" href="classSVF_1_1MTAResultValidator.html#a245c967245e5a693eaf7f60782143d7a">vthdToCxt</a>;</div><div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a7382b2759b01b8382c5e59b21e7e262a"> 139</a></span>&#160; vthdTorthdMap <a class="code" href="classSVF_1_1MTAResultValidator.html#a7382b2759b01b8382c5e59b21e7e262a">vthdTorthd</a>;</div><div class="line"><a name="l00140"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a615623a08324ee155cb527a3b57e8c19"> 140</a></span>&#160; rthdTovthdMap <a class="code" href="classSVF_1_1MTAResultValidator.html#a615623a08324ee155cb527a3b57e8c19">rthdTovthd</a>;</div><div class="line"><a name="l00141"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#ae2717c467dc7c49fab0ec93bfa4baaab"> 141</a></span>&#160; csnumToInst <a class="code" href="classSVF_1_1MTAResultValidator.html#ae2717c467dc7c49fab0ec93bfa4baaab">csnumToInstMap</a>;</div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a542f2f41c90698270687fc7858a26555"> 142</a></span>&#160; rthdToChildrenMap <a class="code" href="classSVF_1_1MTAResultValidator.html#a542f2f41c90698270687fc7858a26555">rthdToChildren</a>;</div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a5a0f25f5718d84f251331a2e2d207108"> 143</a></span>&#160; <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1MTAResultValidator.html#a5a0f25f5718d84f251331a2e2d207108">mod</a>;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a5a6e2f2d1d6aa6fb3a83455b5a288ff1"> 146</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> INTERLEV_FLAG <a class="code" href="classSVF_1_1MTAResultValidator.html#a5a6e2f2d1d6aa6fb3a83455b5a288ff1">INTERLEV_TRUE</a> = 0x01;</div><div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a80414f4ba70357742fa0269f93f1a910"> 147</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> INTERLEV_FLAG <a class="code" href="classSVF_1_1MTAResultValidator.html#a80414f4ba70357742fa0269f93f1a910">INTERLEV_IMPRECISE</a> = 0x02;</div><div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="classSVF_1_1MTAResultValidator.html#a0e2fb93a69df487606c0eeaeadab805d"> 148</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> INTERLEV_FLAG <a class="code" href="classSVF_1_1MTAResultValidator.html#a0e2fb93a69df487606c0eeaeadab805d">INTERLEV_UNSOUND</a> = 0x04;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;};</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html"> 169</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1RaceResultValidator.html">RaceResultValidator</a></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;{</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ac57ae430ee5b6868fe810172ec658853"> 172</a></span>&#160; <span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#ac57ae430ee5b6868fe810172ec658853">RC_FLAG</a>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html"> 177</a></span>&#160; <span class="keyword">class </span><a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html">AccessPair</a></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; {</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a7dd2f8afab59ee4d107a6bfdb6c151ea"> 181</a></span>&#160; <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a7dd2f8afab59ee4d107a6bfdb6c151ea">AccessPair</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2,</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keyword">const</span> RC_FLAG flags) :</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; I1(I1), I2(I2), flags(flags)</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; {</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; }</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;</div><div class="line"><a name="l00189"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1"> 189</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(<span class="keyword">const</span> RC_FLAG flag)<span class="keyword"> const</span></div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">return</span> flags &amp; flag;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; }</div><div class="line"><a name="l00193"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a97307972daebc1fc358ba2c8009c5990"> 193</a></span>&#160; <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a97307972daebc1fc358ba2c8009c5990">getInstruction1</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">return</span> I1;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; }</div><div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#acf383712e9399fec0d52614b2338836c"> 197</a></span>&#160; <span class="keyword">inline</span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#acf383712e9399fec0d52614b2338836c">getInstruction2</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keywordflow">return</span> I2;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keyword">private</span>:</div><div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a2f6817c4f04b090ff8ebff68cafa5892"> 204</a></span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a2f6817c4f04b090ff8ebff68cafa5892">I1</a>;</div><div class="line"><a name="l00205"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a4759b40288c232686465893d988697f3"> 205</a></span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a4759b40288c232686465893d988697f3">I2</a>;</div><div class="line"><a name="l00206"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#aafb0a0cd068e1632f0d643233cad8ad9"> 206</a></span>&#160; RC_FLAG <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#aafb0a0cd068e1632f0d643233cad8ad9">flags</a>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; };</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;</div><div class="line"><a name="l00210"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a8f0d25327d5365f6ae229723aa5d6ff7"> 210</a></span>&#160; <span class="keyword">virtual</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a8f0d25327d5365f6ae229723aa5d6ff7">~RaceResultValidator</a>()</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; {</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; release();</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7"> 216</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7">init</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* M)</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; {</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; this-&gt;M = M;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; selectedValidationScenarios = RC_MHP | RC_ALIASES | RC_PROTECTED | RC_RACE;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; collectValidationTargets();</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; }</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ab8a261120a7f6520d22a6f5cdf2257e9"> 224</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#ab8a261120a7f6520d22a6f5cdf2257e9">analyze</a>()</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; validateAll();</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; }</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;</div><div class="line"><a name="l00230"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a64f61b58f59eba5f3e7c69f90edc68df"> 230</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a64f61b58f59eba5f3e7c69f90edc68df">release</a>()</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; {</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; }</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a749793355ab8390a1e6577d7b05efddf"> 235</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a749793355ab8390a1e6577d7b05efddf">hasValidationTarget</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">return</span> !accessPairs.empty();</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ade9f150c970aa2cc481c878aebf71662"> 244</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#ade9f150c970aa2cc481c878aebf71662">mayAccessAliases</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1,</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2)</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; {</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; selectedValidationScenarios &amp;= ~RC_ALIASES;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; }</div><div class="line"><a name="l00250"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aff51b56e5f7173dd8ac053e5d9b1e97d"> 250</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#aff51b56e5f7173dd8ac053e5d9b1e97d">mayHappenInParallel</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1,</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; selectedValidationScenarios &amp;= ~RC_MHP;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; }</div><div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aeb24aa510c7073ef71062e89a11fe00a"> 256</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#aeb24aa510c7073ef71062e89a11fe00a">protectedByCommonLocks</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1,</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; selectedValidationScenarios &amp;= ~RC_PROTECTED;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; }</div><div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a1df6b00752e373ac7bf08a2cae0b9641"> 262</a></span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a1df6b00752e373ac7bf08a2cae0b9641">mayHaveDataRace</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1,</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2)</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; {</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; selectedValidationScenarios &amp;= ~RC_RACE;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; }</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#adb3030fc7514506e2592e11898217375"> 275</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#adb3030fc7514506e2592e11898217375">collectValidationTargets</a>()</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; {</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">// Collect call sites of all RC_ACCESS function calls.</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; std::vector&lt;const CallBase*&gt; csInsts;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* F = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &amp;M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;getLLVMModules())</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; {</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> it = M.begin(); it != M.end(); it++)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> fName = (*it).getName().str();</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">if</span>(fName.find(RC_ACCESS) != std::string::npos)</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; F = &amp;(*it);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; }</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; }</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="keywordflow">if</span> (!F) <span class="keywordflow">return</span>;</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordflow">for</span> (Value::const_use_iterator it = F-&gt;use_begin(), ie =</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; F-&gt;use_end(); it != ie; ++it)</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; {</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a334998718813a19a7697daf4ba282faf">Use</a> *u = &amp;*it;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *user = u-&gt;getUser();</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a5a7dc8680a9714e08b01dd339b85bb20">LLVMUtil::isCallSite</a>(user))</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; {</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* csInst = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a0095d23a9c9d5d62ec4a23c56824b5f0">LLVMUtil::getLLVMCallSite</a>(user);</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; csInsts.push_back(csInst);</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; }</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; assert(csInsts.size() % 2 == 0 &amp;&amp; <span class="stringliteral">&quot;We should have RC_ACCESS called in pairs.&quot;</span>);</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="comment">// Sort the validation sites according to their ids.</span></div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; std::sort(csInsts.begin(), csInsts.end(), compare);</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="comment">// Generate access pairs.</span></div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0, e = csInsts.size(); i != e;)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* CI1 = csInsts[i++];</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* CI2 = csInsts[i++];</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* C = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>&gt;(CI1-&gt;getArgOperand(1));</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; assert(C);</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1 = <a class="code" href="classSVF_1_1MTAResultValidator.html#ab3ba3c6d9c40e97febdab0e7d4ad9a3e">getPreviousMemoryAccessInst</a>(CI1);</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2 = <a class="code" href="classSVF_1_1MTAResultValidator.html#ab3ba3c6d9c40e97febdab0e7d4ad9a3e">getPreviousMemoryAccessInst</a>(CI2);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; assert(I1 &amp;&amp; I2 &amp;&amp; <span class="stringliteral">&quot;RC_ACCESS should be placed immediately after the target memory access.&quot;</span>);</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; RC_FLAG flags = C-&gt;getZExtValue();</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; accessPairs.push_back(<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html">AccessPair</a>(I1, I2, flags));</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; }</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; }</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;</div><div class="line"><a name="l00326"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a58e07fcd0d9a611dfd31ab62802c5990"> 326</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a58e07fcd0d9a611dfd31ab62802c5990">validateAll</a>()</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; {</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot; --- Analysis Result Validation ---\n&quot;</span>);</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="comment">// Iterate every memory access pair to perform the validation.</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0, e = accessPairs.size(); i != e; ++i)</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html">AccessPair</a> &amp;ap = accessPairs[i];</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I1 = ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a97307972daebc1fc358ba2c8009c5990">getInstruction1</a>();</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I2 = ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#acf383712e9399fec0d52614b2338836c">getInstruction2</a>();</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTAResultValidator.html#a2a21cbdf9513e9fe4fa6c6ae56618b18">mhp</a> = mayHappenInParallel(I1, I2);</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="keywordtype">bool</span> alias = mayAccessAliases(I1, I2);</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keywordtype">bool</span> protect = protectedByCommonLocks(I1, I2);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordtype">bool</span> racy = mayHaveDataRace(I1, I2);</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;For the memory access pair at (&quot;</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(I1)-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a7effb0f37f486745e0cdc3ae5e9c732b">getSourceLoc</a>() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(I2)-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a7effb0f37f486745e0cdc3ae5e9c732b">getSourceLoc</a>() &lt;&lt; <span class="stringliteral">&quot;)\n&quot;</span>;</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">if</span> (selectedValidationScenarios &amp; RC_ALIASES)</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="stringliteral">&quot;ALIASES&quot;</span>, alias, ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(RC_ALIASES))</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keywordflow">if</span> (selectedValidationScenarios &amp; RC_MHP)</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; {</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="stringliteral">&quot;MHP&quot;</span>, mhp, ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(RC_MHP)) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; }</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">if</span> (selectedValidationScenarios &amp; RC_PROTECTED)</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; {</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="stringliteral">&quot;PROTECT&quot;</span>, protect,</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(RC_PROTECTED)) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; }</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">if</span> (selectedValidationScenarios &amp; RC_RACE)</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; {</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; &lt;&lt; <a class="code" href="classSVF_1_1MTAResultValidator.html#a9c9baeb57a645b57cc9053b3071f0602">getOutput</a>(<span class="stringliteral">&quot;RACE&quot;</span>, racy, ap.<a class="code" href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a63f574da7298fd47d228592f512891d1">isFlaged</a>(RC_RACE))</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; }</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; }</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; }</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160;</div><div class="line"><a name="l00374"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#afdd89e26a7c168762bfe85746252827f"> 374</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1RaceResultValidator.html#afdd89e26a7c168762bfe85746252827f">getOutput</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *scenario,</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keywordtype">bool</span> analysisRes, <span class="keywordtype">bool</span> expectedRes)</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; {</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> ret(scenario);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; ret += <span class="stringliteral">&quot;\t&quot;</span>;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">if</span> (expectedRes)</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; ret += <span class="stringliteral">&quot; T: &quot;</span>;</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; ret += <span class="stringliteral">&quot; F: &quot;</span>;</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">if</span> (analysisRes == expectedRes)</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; ret += <a class="code" href="namespaceSVF_1_1SVFUtil.html#a6a55f1f8598998a3ffbbc67d32eaf8c4">SVFUtil::sucMsg</a>(<span class="stringliteral">&quot;SUCCESS&quot;</span>);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; ret += <a class="code" href="namespaceSVF_1_1SVFUtil.html#a5d4bb92f5df30417f414397f8e58cf01">SVFUtil::errMsg</a>(<span class="stringliteral">&quot;FAILURE&quot;</span>);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; }</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00391"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aedc9ec6c3db947fa7e1ef50fbb61e9a8"> 391</a></span>&#160; <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1RaceResultValidator.html#aedc9ec6c3db947fa7e1ef50fbb61e9a8">M</a>;</div><div class="line"><a name="l00392"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a90f7d527816acf808e3e54c2a4ed0532"> 392</a></span>&#160; std::vector&lt;AccessPair&gt; <a class="code" href="classSVF_1_1RaceResultValidator.html#a90f7d527816acf808e3e54c2a4ed0532">accessPairs</a>;</div><div class="line"><a name="l00393"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a1294cb90b073ba25a8ffc06180c09419"> 393</a></span>&#160; RC_FLAG <a class="code" href="classSVF_1_1RaceResultValidator.html#a1294cb90b073ba25a8ffc06180c09419">selectedValidationScenarios</a>;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00399"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a2fbfa7dffd33fa23fdddc60b94af8467"> 399</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceResultValidator.html#a2fbfa7dffd33fa23fdddc60b94af8467">compare</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* CI1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* CI2)</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; {</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *V1 = CI1-&gt;getArgOperand(0);</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *V2 = CI2-&gt;getArgOperand(0);</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* C1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>&gt;(V1);</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* C2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>&gt;(V2);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; assert(0 != C1 &amp;&amp; 0 != C2);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keywordflow">return</span> C1-&gt;getZExtValue() &lt; C2-&gt;getZExtValue();</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; }</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;</div><div class="line"><a name="l00414"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ad029f7a9a5161191a44d1e841f9d6114"> 414</a></span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* <a class="code" href="classSVF_1_1RaceResultValidator.html#ad029f7a9a5161191a44d1e841f9d6114">getPreviousMemoryAccessInst</a>(</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* I)</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; {</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; I = I-&gt;getPrevNode();</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="keywordflow">while</span> (I)</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; {</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;LoadInst, StoreInst&gt;(I))</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keywordflow">return</span> I;</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* inst = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(I);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *callee = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(inst))</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; {</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">if</span> (callee-&gt;getName().find(<span class="stringliteral">&quot;llvm.memset&quot;</span>) != std::string::npos)</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordflow">return</span> I;</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160;</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; }</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; I = I-&gt;getPrevNode();</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; }</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; }</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160;</div><div class="line"><a name="l00438"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#aa4129053b7248d4e95763f0b41044e4c"> 438</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> RC_FLAG RC_MHP = 0x01;</div><div class="line"><a name="l00439"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#a090afdd4eb0d60b2a0408f9b5ea4a30e"> 439</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> RC_FLAG RC_ALIASES = 0x02;</div><div class="line"><a name="l00440"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#abcdd726f56cc2deb6cad72456863fc9b"> 440</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> RC_FLAG RC_PROTECTED = 0x04;</div><div class="line"><a name="l00441"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#abb9eba49d091d292a13478f659a5e53b"> 441</a></span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> RC_FLAG RC_RACE = 0x10;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160;</div><div class="line"><a name="l00446"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceResultValidator.html#ac2523a7320897a144202dc5bdc083507"> 446</a></span>&#160; <span class="keyword">static</span> constexpr <span class="keywordtype">char</span> <span class="keyword">const</span> *RC_ACCESS = <span class="stringliteral">&quot;RC_ACCESS&quot;</span>;</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160;};</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160;} <span class="comment">// namespace SVF end</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* MTARESULTVALIDATOR_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="classSVF_1_1RaceResultValidator_html_aff51b56e5f7173dd8ac053e5d9b1e97d"><div class="ttname"><a href="classSVF_1_1RaceResultValidator.html#aff51b56e5f7173dd8ac053e5d9b1e97d">SVF::RaceResultValidator::mayHappenInParallel</a></div><div class="ttdeci">virtual bool mayHappenInParallel(const Instruction *I1, const Instruction *I2)</div><div class="ttdef"><b>Definition:</b> <a href="include_2MTA_2MTAResultValidator_8h_source.html#l00250">MTAResultValidator.h:250</a></div></div>
70
70
  <div class="ttc" id="classSVF_1_1MHP_html"><div class="ttname"><a href="classSVF_1_1MHP.html">SVF::MHP</a></div><div class="ttdef"><b>Definition:</b> <a href="MHP_8h_source.html#l00045">MHP.h:45</a></div></div>
71
71
  <div class="ttc" id="namespaceSVF_html_a334998718813a19a7697daf4ba282faf"><div class="ttname"><a href="namespaceSVF.html#a334998718813a19a7697daf4ba282faf">SVF::Use</a></div><div class="ttdeci">llvm::Use Use</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00046">BasicTypes.h:46</a></div></div>
72
72
  <div class="ttc" id="classSVF_1_1RaceResultValidator_1_1AccessPair_html_a97307972daebc1fc358ba2c8009c5990"><div class="ttname"><a href="classSVF_1_1RaceResultValidator_1_1AccessPair.html#a97307972daebc1fc358ba2c8009c5990">SVF::RaceResultValidator::AccessPair::getInstruction1</a></div><div class="ttdeci">const Instruction * getInstruction1() const</div><div class="ttdef"><b>Definition:</b> <a href="include_2MTA_2MTAResultValidator_8h_source.html#l00193">MTAResultValidator.h:193</a></div></div>
@@ -97,7 +97,7 @@ $(function() {
97
97
  <div class="ttc" id="classSVF_1_1MTAResultValidator_html_a7382b2759b01b8382c5e59b21e7e262a"><div class="ttname"><a href="classSVF_1_1MTAResultValidator.html#a7382b2759b01b8382c5e59b21e7e262a">SVF::MTAResultValidator::vthdTorthd</a></div><div class="ttdeci">vthdTorthdMap vthdTorthd</div><div class="ttdef"><b>Definition:</b> <a href="include_2MTA_2MTAResultValidator_8h_source.html#l00139">MTAResultValidator.h:139</a></div></div>
98
98
  <div class="ttc" id="classSVF_1_1MTAResultValidator_html_ac24a8a6922d9dc9edecab3bc45bc9204"><div class="ttname"><a href="classSVF_1_1MTAResultValidator.html#ac24a8a6922d9dc9edecab3bc45bc9204">SVF::MTAResultValidator::getOutputforInterlevAnalysis</a></div><div class="ttdeci">std::string getOutputforInterlevAnalysis(const char *scenario, INTERLEV_FLAG analysisRes)</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8cpp_source.html#l00157">MTAResultValidator.cpp:157</a></div></div>
99
99
  <div class="ttc" id="classSVF_1_1MTAResultValidator_html_a373b5227fbfa82ac070f55db999afb28"><div class="ttname"><a href="classSVF_1_1MTAResultValidator.html#a373b5227fbfa82ac070f55db999afb28">SVF::MTAResultValidator::validateInterleaving</a></div><div class="ttdeci">INTERLEV_FLAG validateInterleaving()</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8cpp_source.html#l00496">MTAResultValidator.cpp:496</a></div></div>
100
- <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_af6e96694d983643a66c238cce01bff0e"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if_t&lt;!is_simple_type&lt; Y &gt;::value, typename cast_retty&lt; X, const Y &gt;::ret_type &gt; dyn_cast(const Y &amp;Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00398">Casting.h:398</a></div></div>
100
+ <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_af6e96694d983643a66c238cce01bff0e"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if_t&lt;!is_simple_type&lt; Y &gt;::value, typename cast_retty&lt; X, const Y &gt;::ret_type &gt; dyn_cast(const Y &amp;Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00405">Casting.h:405</a></div></div>
101
101
  <div class="ttc" id="classSVF_1_1MTAResultValidator_html_a7d2043cf3c354812fa5e4cdf7f60ff20"><div class="ttname"><a href="classSVF_1_1MTAResultValidator.html#a7d2043cf3c354812fa5e4cdf7f60ff20">SVF::MTAResultValidator::rthdToChildrenMap</a></div><div class="ttdeci">Map&lt; NodeID, Set&lt; NodeID &gt; &gt; rthdToChildrenMap</div><div class="ttdef"><b>Definition:</b> <a href="include_2MTA_2MTAResultValidator_8h_source.html#l00126">MTAResultValidator.h:126</a></div></div>
102
102
  <div class="ttc" id="classSVF_1_1RaceResultValidator_html_afdd89e26a7c168762bfe85746252827f"><div class="ttname"><a href="classSVF_1_1RaceResultValidator.html#afdd89e26a7c168762bfe85746252827f">SVF::RaceResultValidator::getOutput</a></div><div class="ttdeci">std::string getOutput(const char *scenario, bool analysisRes, bool expectedRes)</div><div class="ttdoc">Get the validation result string of a single validation scenario. </div><div class="ttdef"><b>Definition:</b> <a href="include_2MTA_2MTAResultValidator_8h_source.html#l00374">MTAResultValidator.h:374</a></div></div>
103
103
  <div class="ttc" id="classSVF_1_1SVFModule_html"><div class="ttname"><a href="classSVF_1_1SVFModule.html">SVF::SVFModule</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00041">SVFModule.h:41</a></div></div>