This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
<!DOCTYPE html>
<htmlxmlns="http://www.w3.org/1999/xhtml"><head><title>PulseAbductiveDomain (infer.Pulselib.PulseAbductiveDomain)</title><linkrel="stylesheet"href="../../../odoc.css"/><metacharset="utf-8"/><metaname="generator"content="odoc 1.5.1"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><scriptsrc="../../../highlight.pack.js"></script><script>hljs.initHighlightingOnLoad();</script></head><body><divclass="content"><header><nav><ahref="../index.html">Up</a>–<ahref="../../index.html">infer</a>»<ahref="../index.html">Pulselib</a>» PulseAbductiveDomain</nav><h1>Module <code>Pulselib.PulseAbductiveDomain</code></h1></header><divclass="spec module"id="module-F"><ahref="#module-F"class="anchor"></a><code><spanclass="keyword">module</span> F = Stdlib.Format</code></div><divclass="spec module"id="module-BaseAddressAttributes"><ahref="#module-BaseAddressAttributes"class="anchor"></a><code><spanclass="keyword">module</span> BaseAddressAttributes = <ahref="../index.html#module-PulseBaseAddressAttributes">PulseBaseAddressAttributes</a></code></div><divclass="spec module"id="module-BaseDomain"><ahref="#module-BaseDomain"class="anchor"></a><code><spanclass="keyword">module</span> BaseDomain = <ahref="../index.html#module-PulseBaseDomain">PulseBaseDomain</a></code></div><divclass="spec module"id="module-BaseMemory"><ahref="#module-BaseMemory"class="anchor"></a><code><spanclass="keyword">module</span> BaseMemory = <ahref="../index.html#module-PulseBaseMemory">PulseBaseMemory</a></code></div><divclass="spec module"id="module-BaseStack"><ahref="#module-BaseStack"class="anchor"></a><code><spanclass="keyword">module</span> BaseStack = <ahref="../index.html#module-PulseBaseStack">PulseBaseStack</a></code></div><aside><p>Layer on top of <ahref="BaseDomain/index.html"><code>BaseDomain</code></a> to propagate operations on the current state to the pre-condition when necessary</p><p>The abstract type <code>t</code> is a pre/post pair in the style of biabduction.</p></aside><dl><dtclass="spec module-type"id="module-type-BaseDomainSig"><ahref="#module-type-BaseDomainSig"class="anchor"></a><code><spanclass="keyword">module</span><spanclass="keyword">type</span><ahref="module-type-BaseDomainSig/index.html">BaseDomainSig</a> = <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>signature common to the "normal"<code>Domain</code>, representing the post at the current program point, and the inverted <code>PreDomain</code>, representing the inferred pre-condition</p></dd></dl><dl><dtclass="spec module"id="module-PostDomain"><ahref="#module-PostDomain"class="anchor"></a><code><spanclass="keyword">module</span><ahref="PostDomain/index.html">PostDomain</a> : <ahref="index.html#module-type-BaseDomainSig">BaseDomainSig</a></code></dt><dd><p>The post abstract state at each program point, or current state.</p></dd></dl><dl><dtclass="spec module"id="module-PreDomain"><ahref="#module-PreDomain"class="anchor"></a><code><spanclass="keyword">module</span><ahref="PreDomain/index.html">PreDomain</a> : <ahref="index.html#module-type-BaseDomainSig">BaseDomainSig</a></code></dt><dd><p>The inferred pre-condition at each program point, biabduction style.</p></dd></dl><dl><dtclass="spec type"id="type-t"><ahref="#type-t"class="anchor"></a><code><spanclass="keyword">type</span> t</code><code> = <spanclass="keyword">private</span></code><code>{</code><tableclass="record"><trid="type-t.post"class="anchored"><tdclass="def field"><ahref="#type-t.post"class="anchor"></a><code>post : <ahref="PostDomain/index.html#type-t">PostDomain.t</a>;</code></td><tdclass="doc"><p>state at the current program point</p></td></tr><trid="type-t.pre"class="anchored"><tdclass="def field"><ahref="#type-t.pre"class="anchor"></a><code>pre : <ahref="PreDomain/index.html#type-t">PreDomain.t</a>;</code></td><tdclass="doc"><p>inferred procedure pre-condition leading to the current program point</p></td></tr><trid="type-t.path_condition"class="anchored"><tdclass="def field"><ahref="#type-t.path_condition"class="anchor"></a><code>path_condition : <ahref="../PulsePathCondition/index.html#type-t">PulseBasicInterface.PathCondition.t</a>;</code></td><tdclass="doc"><p>arithmetic facts true along the path (holding for both <code>pre</code> and <code>post</code> since abstract values are immutable)</p></td></tr><trid="type-t.topl"class="anchored"><tdclass="def field"><ahref="#type-t.topl"class="anchor"></a><code>topl : <ahref="../PulseTopl/index.html#type-state">PulseTopl.state</a>;</code></td><tdclass="doc"><p>state at of the Topl monitor at the current program point, when Topl is enabled</p></td></tr><trid="type-t.skipped_calls"class="anchored"><tdclass="def field"><ahref="#type-t.skipped_calls"class="anchor"></a><code>skipped_calls : <ahref="../PulseSkippedCalls/index.html#type-t">PulseBasicInterface.SkippedCalls.t</a>;</code></td><tdclass="doc"><p>metadata: procedure calls for which no summary was found</p></td></tr></table><code>}</code></dt><dd><p>pre/post on a single program path</p></dd></dl><div><divclass="spec include"><divclass="doc"><dl><dtclass="spec value"id="val-equal"><ahref="#val-equal"class="anchor"></a><code><spanclass="keyword">val</span> equal : <ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span> bool</code></dt></dl></div></div></div><dl><dtclass="spec value"id="val-leq"><ahref="#val-leq"class="anchor"></a><code><spanclass="keyword">val</span> leq : <span>lhs:<ahref="index.html#type-t">t</a></span><span>-></span><span>rhs:<ahref="index.html#type-t">t</a></span><span>-></span> bool</code></dt><dtclass="spec value"id="val-pp"><ahref="#val-pp"class="anchor"></a><code><spanclass="keyword">val</span> pp : Stdlib.Format.formatter <span>-></span><ahref="index.html#type-t">t</a><span>-></span> unit</code></dt><dtclass="spec value"id="val-mk_initial"><ahref="#val-mk_initial"class="anchor"></a><code><spanclass="keyword">val</span> mk_initial : <ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a><span>-></span><ahref="../../IR/Procdesc/index.html#type-t">IR.Procdesc.t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-get_pre"><ahref="#val-get_pre"class="anchor"></a><code><spanclass="keyword">val</span> get_pre : <ahref="index.html#type-t">t</a><span>-></span><ahref="../PulseBaseDomain/index.html#type-t">BaseDomain.t</a></code></dt><dtclass="spec value"id="val-get_post"><ahref="#val-get_post"class="anchor"></a><code><spanclass="keyword">val</span> get_post : <ahref="index.html#type-t">t</a><span>-></span><ahref="../PulseBaseDomain/index.html#type-t">BaseDomain.t</a></code></dt><dtclass="spec value"id="val-simplify_instanceof"><ahref="#val-simplify_instanceof"class="anchor"></a><code><spanclass="keyword">val</span> simplify_instanceof : <ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt></dl><dl><dtclass="spec module"id="module-Stack"><ahref="#module-Stack"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Stack/index.html">Stack</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>stack operations like <ahref="BaseStack/index.html"><code>BaseStack</code></a> but that also take care of propagating facts to the precondition</p></dd></dl><dl><dtclass="spec module"id="module-Memory"><ahref="#module-Memory"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Memory/index.html">Memory</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>memory operations like <ahref="BaseMemory/index.html"><code>BaseMemory</code></a> but that also take care of propagating facts to the precondition</p></dd></dl><dl><dtclass="spec module"id="module-AddressAttributes"><ahref="#module-AddressAttributes"class="anchor"></a><code><spanclass="keyword">module</span><ahref="AddressAttributes/index.html">AddressAttributes</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>attribute operations like <ahref="BaseAddressAttributes/index.html"><code>BaseAddressAttributes</code></a> but that also take care of propagating facts to the precondition</p></dd></dl><dl><dtclass="spec value"id="val-is_local"><ahref="#val-is_local"class="anchor"></a><code><spanclass="keyword">val</span> is_local : <ahref="../../IR/Var/index.html#type-t">IR.Var.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span> bool</code></dt><dtclass="spec value"id="val-find_post_cell_opt"><ahref="#val-find_post_cell_opt"class="anchor"></a><code><spanclass="keyword">val</span> find_post_cell_opt : <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="../PulseBaseDomain/index.html#type-cell">BaseDomain.cell</a> option</span></code></dt><dtclass="spec value"id="val-discard_unreachable"><ahref="#val-discard_unreachable"class="anchor"></a><code><spanclass="keyword">val</span> discard_unreachable : <ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a> * <ahref="../../Pulselib__PulseAbstractValue/index.html#module-Set">Pulselib.PulseBasicInterface.AbstractValue.Set</a>.t * <span><ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> list</span></code></dt><dd><p>garbage collect unreachable addresses in the state to make it smaller and return the new state, the live addresses, and the discarded addresses that used to have attributes attached</p></dd></dl><dl><dtclass="spec value"id="val-add_skipped_call"><ahref="#val-add_skipped_call"class="anchor"></a><code><spanclass="keyword">val</span> add_skipped_call : <ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a><span>-></span><ahref="../PulseTrace/index.html#type-t">PulseBasicInterface.Trace.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-add_skipped_calls"><ahref="#val-add_skipped_calls"class="anchor"></a><code><spanclass="keyword">val</span> add_skipped_calls : <ahref="../PulseSkippedCalls/index.html#type-t">PulseBasicInterface.SkippedCalls.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-set_path_condition"><ahref="#val-set_path_condition"class="anchor"></a><code><spanclass="keyword">val</span> set_path_condition : <ahref="../PulsePathCondition/index.html#type-t">PulseBasicInterface.PathCondition.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt></dl><dl><dtclass="spec type"id="type-summary"><ahref="#type-summary"class="anchor"></a><code><spanclass="keyword">type</span> summary</code><code> = <spanclass="keyword">private</span><ahref="index.html#type-t">t</a></code></dt><dd><p>private type to make sure <ahref="index.html#val-summary_of_post"><code>summary_of_post</code></a> is always called when creating summaries</p></dd></dl><div><divclass="spec include"><divclass="doc"><dl><dtclass="spec value"id="val-compare_summary"><ahref="#val-compare_summary"class="anchor"></a><code><spanclass="keyword">val</span> compare_summary : <ahref="index.html#type-summary">summary</a><span>-></span><ahref="index.html#type-summary">summary</a><span>-></span> int</code></dt><dtclass="spec value"id="val-equal_summary"><ahref="#val-equal_summary"class="anchor"></a><code><spanclass="keyword">val</span> equal_summary : <ahref="index.html#type-summary">summary</a><span>-></span><ahref="index.html#type-summary">summary</a><span>-></span> bool</code></dt><dtclass="spec value"id="val-yojson_of_summary"><ahref="#val-yojson_of_summary"class="anchor"></a><code><spanclass="keyword">val</span> yojson_of_summary : <ahref="index.html#type-summary">summary</a><span>-></span> Ppx_yojson_conv_lib.Yojson.Safe.t</code></dt></dl></div></div></div><dl><dtclass="spec value"id="val-skipped_calls_match_pattern"><ahref="#val-skipped_calls_match_pattern"class="anchor"></a><code><spanclass="keyword">val</span> skipped_calls_match_pattern : <ahref="index.html#type-summary">summary</a><span>-></span> bool</code></dt><dtclass="spec value"id="val-summary_of_post"><ahref="#val-summary_of_post"class="anchor"></a><code><spanclass="keyword">val</span> summary_of_post : <ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a><span>-></span><ahref="../../IR/Procdesc/index.html#type-t">IR.Procdesc.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span><span>(<ahref="index.html#type-summary">summary</a>,<span>[><span>`PotentialInvalidAccessSummary of <ahref="index.html#type-summary">summary</a> * <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseTrace/index.html#type-t">PulseBasicInterface.Trace.t</a></span> ]</span>)</span><ahref="../../IStdlib/index.html#module-IStd">IStdlib.IStd</a>.result</span><ahref="../PulseSatUnsat/index.html#type-t">PulseBasicInterface.SatUnsat.t</a></span></code></dt><dd><p>trim the state down to just the procedure's interface (formals and globals), and simplify and normalize the state</p></dd></dl><dl><dtclass="spec value"id="val-set_post_edges"><ahref="#val-set_post_edges"class="anchor"></a><code><spanclass="keyword">val</span> set_post_edges : <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a><span>-></span><ahref="../../Pulselib__PulseBaseMemory/Edges/index.html#type-t">BaseMemory.Edges.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>directly set the edges for the given address, bypassing abduction altogether</p></dd></dl><dl><dtclass="spec value"id="val-set_post_cell"><ahref="#val-set_post_cell"class="anchor"></a><code><spanclass="keyword">val</span> set_post_cell : <span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span><span>-></span><ahref="../PulseBaseDomain/index.html#type-cell">BaseDomain.cell</a><span>-></span><ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>directly set the edges and attributes for the given address, bypassing abduction altogether</p></dd></dl><dl><dtclass="spec value"id="val-incorporate_new_eqs"><ahref="#val-incorporate_new_eqs"class="anchor"></a><code><spanclass="keyword">val</span> incorporate_new_eqs : <ahref="../PulsePathCondition/index.html#type-new_eqs">PulseBasicInterface.PathCondition.new_eqs</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a>,<span>[><span>`PotentialInvalidAccess of <ahref="index.html#type-t">t</a> * <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseTrace/index.html#type-t">PulseBasicInterface.Trace.t</a></span> ]</span>)</span><ahref="../../IStdlib/index.html#module-IStd">IStdlib.IStd</a>.result</span></code></dt><dd><p>Check that the new equalities discovered are compatible with the current pre and post heaps, e.g. <code>x = 0</code> is not compatible with <code>x</code> being allocated, and <code>x = y</code> is not compatible with <code>x</code> and <code>y</code> being allocated separately. In those cases, the resulting path condition is <spanclass="xref-unresolved"title="unresolved reference to "PathCondition.false_""><code>PathCondition</code>.false_</span>.</p></dd></dl><dl><dtclass="spec value"id="val-initialize"><ahref="#val-initialize"class="anchor"></a><code><spanclass="keyword">val</span> initialize : <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>Remove "Uninitialized" attribute of the given address</p></dd></dl><dl><dtclass="spec value"id="val-set_uninitialized"><ahref="#val-set_uninitialized"class="anchor"></a><code><spanclass="keyword">val</span> set_uninitialized : <ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a><span>-></span><span>[ <span>`LocalDecl of <ahref="../../IR/Pvar/index.html#type-t">IR.Pvar.t</a> * <span><ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> option</span></span><span><span>| `Malloc</span> of <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a></span> ]</span><span>-></span><ahref="../../IR/Typ/index.html#type-t">IR.Typ.t</a><span>-></span><ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>Add "Uninitialized" attributes when a variable is declared or a memory is allocated by malloc.</p></dd></dl><divclass="spec module"id="module-Topl"><ahref="#module-Topl"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Topl/index.html">Topl</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></div></div></body></html>