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>PulseOperations (infer.Pulselib.PulseOperations)</title><linkrel="stylesheet"href="../../../odoc.css"/><metacharset="utf-8"/><metaname="generator"content="odoc 1.5.2"/><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>» PulseOperations</nav><h1>Module <code>Pulselib.PulseOperations</code></h1></header><dl><dtclass="spec module"id="module-Import"><ahref="#module-Import"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Import/index.html">Import</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>For <code>open</code>ing in other modules.</p></dd></dl><div><divclass="spec include"><divclass="doc"><detailsopen="open"><summary><spanclass="def"><code><spanclass="keyword">include</span><spanclass="keyword">module</span><spanclass="keyword">type</span><spanclass="keyword">of</span><ahref="index.html#module-Import">Import</a></code></span></summary><dl><dtclass="spec type"id="type-access_mode"><ahref="#type-access_mode"class="anchor"></a><code><spanclass="keyword">type</span> access_mode</code><code> = </code><tableclass="variant"><trid="type-access_mode.Read"class="anchored"><tdclass="def constructor"><ahref="#type-access_mode.Read"class="anchor"></a><code>| </code><code><spanclass="constructor">Read</span></code></td></tr><trid="type-access_mode.Write"class="anchored"><tdclass="def constructor"><ahref="#type-access_mode.Write"class="anchor"></a><code>| </code><code><spanclass="constructor">Write</span></code></td></tr><trid="type-access_mode.NoAccess"class="anchored"><tdclass="def constructor"><ahref="#type-access_mode.NoAccess"class="anchor"></a><code>| </code><code><spanclass="constructor">NoAccess</span></code></td><tdclass="doc"><p>The initialized-ness of the address is not checked when it evaluates a heap address without actual memory access, for example, when evaluating <code>&x.f</code> we need to check initialized-ness of <code>x</code>, not that of <code>x.f</code>.</p></td></tr></table></dt></dl><section><header><h3id="imported-types-for-ease-of-use-and-so-we-can-write-variants-without-the-corresponding-module-prefix"><ahref="#imported-types-for-ease-of-use-and-so-we-can-write-variants-without-the-corresponding-module-prefix"class="anchor"></a>Imported types for ease of use and so we can write variants without the corresponding module prefix</h3></header><dl><dtclass="spec type"id="type-execution_domain_base_t"><ahref="#type-execution_domain_base_t"class="anchor"></a><code><spanclass="keyword">type</span><span>'abductive_domain_t execution_domain_base_t</span></code><code> = <span><spanclass="type-var">'abductive_domain_t</span><ahref="../PulseExecutionDomain/index.html#type-base_t">PulseDomainInterface.ExecutionDomain.base_t</a></span></code><code> = </code><tableclass="variant"><trid="type-execution_domain_base_t.ContinueProgram"class="anchored"><tdclass="def constructor"><ahref="#type-execution_domain_base_t.ContinueProgram"class="anchor"></a><code>| </code><code><spanclass="constructor">ContinueProgram</span><spanclass="keyword">of</span><spanclass="type-var">'abductive_domain_t</span></code></td></tr><trid="type-execution_domain_base_t.ExitProgram"class="anchored"><tdclass="def constructor"><ahref="#type-execution_domain_base_t.ExitProgram"class="anchor"></a><code>| </code><code><spanclass="constructor">ExitProgram</span><spanclass="keyword">of</span><ahref="../PulseAbductiveDomain/index.html#type-summary">PulseDomainInterface.AbductiveDomain.summary</a></code></td></tr><trid="type-execution_domain_base_t.AbortProgram"class="anchored"><tdclass="def constructor"><ahref="#type-execution_domain_base_t.AbortProgram"class="anchor"></a><code>| </code><code><spanclass="constructor">AbortProgram</span><spanclass="keyword">of</span><ahref="../PulseAbductiveDomain/index.html#type-summary">PulseDomainInterface.AbductiveDomain.summary</a></code></td></tr><trid="type-execution_domain_base_t.LatentAbortProgram"class="anchored"><tdclass="def constructor"><ahref="#type-execution_domain_base_t.LatentAbortProgram"class="anchor"></a><code>| </code><code><spanclass="constructor">LatentAbortProgram</span><spanclass="keyword">of</span></code><code>{</code><tableclass="record"><trid="type-execution_domain_base_t.astate"class="anchored"><tdclass="def field"><ahref="#type-execution_domain_base_t.astate"class="anchor"></a><code>astate : <ahref="../PulseAbductiveDomain/index.html#type-summary">PulseDomainInterface.AbductiveDomain.summary</a>;</code></td></tr><trid="type-execution_domain_base_t.latent_issue"class="anchored"><tdclass="def field"><ahref="#type-execution_domain_base_t.latent_issue"class="anchor"></a><code>latent_issue : <ahref="../PulseLatentIssue/index.html#type-t">PulseDomainInterface.LatentIssue.t</a>;</code></td></tr></table><code>}</code></td></tr><trid="type-execution_domain_base_t.LatentInvalidAccess"class="anchored"><tdclass="def constructor"><ahref="#type-execution_domain_base_t.LatentInvalidAccess"class="anchor"></a><code>| </code><code><spanclass="constructor">LatentInvalidAccess</span><spanclass="keyword">of</span></code><code>{</code><tableclass="record"><trid="type-execution_domain_base_t.astate"class="anchored"><tdclass="def field"><ahref="#type-execution_domain_base_t.astate"class="anchor"></a><code>astate : <ahref="../PulseAbductiveDomain/index.html#type-summary">PulseDomainInterface.AbductiveDomain.summary</a>;</code></td></tr><trid="type-execution_domain_base_t.address"class="anchored"><tdclass="def field"><ahref="#type-execution_domain_base_t.address"class="anchor"></a><code>address : <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a>;</code></td></tr><trid="type-execution_domain_base_t.must_be_valid"class="anchored"><tdclass="def field"><ahref="#type-execution_domain_base_t.must_be_valid"class="anchor"></a><code>must_be_valid : <ahref="../PulseTrace/index.html#type-t">PulseBasicInterface.Trace.t</a> * <span><ahref="../PulseInvalidation/index.html#type-must_be_valid_reason">PulseBasicInterface.Invalidation.must_be_valid_reason</a> option</span>;</code></td></tr><trid="type-execution_domain_base_t.calling_context"class="anchored"><tdclass="def field"><ahref="#type-execution_domain_base_t.calling_context"class="anchor"></a><code>calling_context : <span><span>(<ahref="../PulseCallEvent/index.html#type-t">PulseBasicInterface.CallEvent.t</a> * <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a>)</span> list</span>;</code></td></tr></table><code>}</code></td></tr><trid="type-execution_domain_base_t.ISLLatentMemoryError"class="anchored"><tdclass="def constructor"><ahref="#type-execution_domain_base_t.ISLLatentMemoryError"class="anchor"></a><code>| </code><code><spanclass="constructor">ISLLatentMemoryError</span><spanclass="keyword">of</span><ahref="../PulseAbductiveDomain/index.html#type-summary">PulseDomainInterface.AbductiveDomain.summary</a></code></td></tr></table></dt><dtclass="spec type"id="type-base_error"><ahref="#type-base_error"class="anchor"></a><code><spanclass="keyword">type</span><span>'astate base_error</span></code><code> = <span><spanclass="type-var">'astate</span><ahref="../PulseAccessResult/index.html#type-error">PulseDomainInterface.AccessResult.error</a></span></code><code> = </code><tableclass="variant"><trid="type-base_error.PotentialInvalidAccess"class="anchored"><tdclass="def constructor"><ahref="#type-base_error.PotentialInvalidAccess"class="anchor"></a><code>| </code><code><spanclass="constructor">PotentialInvalidAccess</span><spanclass="keyword">of</span></code><code>{</code><tableclass="record"><trid="type-base_error.astate"class="anchored"><tdclass="def field"><ahref="#type-base_error.astate"class="anchor"></a><code>astate : <spanclass="type-var">'astate</span>;</code></td></tr><trid="type-base_error.address"class="anchored"><tdclass="def field"><ahref="#type-base_error.address"class="anchor"></a><code>address : <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a>;</code></td></tr><trid="type-base_error.must_be_valid"class="anchored"><tdclass="def field"><ahref="#type-base_error.must_be_valid"class="anchor"></a><code>must_be_valid : <ahref="../PulseTrace/index.html#type-t">PulseBasicInterface.Trace.t</a> * <span><ahref="../PulseInvalidation/index.html#type-must_be_valid_reason">PulseBasicInterface.Invalidation.must_be_valid_reason</a> option</span>;</code></td></tr></table><code>}</code></td></tr><trid="type-base_error.PotentialInvalidAccessSummary"class="anchored"><tdclass="def constructor"><ahref="#type-base_error.PotentialInvalidAccessSummary"class="anchor"></a><code>| </code><code><spanclass="constructor">PotentialInvalidAccessSummary</span><spanclass="keyword">of</span></code><code>{</code><tableclass="record"><trid="type-base_error.astate"class="anchored"><tdclass="def field"><ahref="#type-base_error.astate"class="anchor"></a><code>astate : <ahref="../PulseAbductiveDomain/index.html#type-summary">PulseDomainInterface.AbductiveDomain.summary</a>;</code></td></tr><trid="type-base_error.address"class="anchored"><tdclass="def field"><ahref="#type-base_error.address"class="anchor"></a><code>address : <ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a>;</code></td></tr><trid="type-base_error.must_be_valid"class="anchored"><tdclass="def field"><ahref="#type-base_error.must_be_valid"class="anchor"></a><code>must_be_valid : <ahref="../PulseTrace/index.html#type-t">PulseBasicInterface.Trace.t</a> * <span><ahref="../PulseInvalidation/index.html#type-must_be_valid_reason">PulseBasicInterface.Invalidation.must_be_valid_reason</a> option</span>;</code></td></tr></table><code>}</code></td></tr><trid="type-base_error.ReportableError"class="anchored"><tdclass="def constructor"><ahref="#type-base_error.ReportableError"class="anchor"></a><code>| </code><code><spanclass="constructor">ReportableError</span><spanclass="keyword">of</span></code><code>{</code><tableclass="record"><trid="type-base_error.astate"class="anchored"><tdclass="def field"><ahref="#type-base_error.astate"class="anchor"></a><code>astate : <spanclass="type-var">'astate</span>;</code></td></tr><trid="type-base_error.diagnostic"class="anchored"><tdclass="def field"><ahref="#type-base_error.diagnostic"class="anchor"></a><code>diagnostic : <ahref="../PulseDiagnostic/index.html#type-t">PulseBasicInterface.Diagnostic.t</a>;</code></td></tr></table><code>}</code></td></tr><trid="type-base_error.ISLError"class="anchored"><tdclass="def constructor"><ahref="#type-base_error.ISLError"class="anchor"></a><code>| </code><code><spanclass="constructor">ISLError</span><spanclass="keyword">of</span><spanclass="type-var">'astate</span></code></td></tr></table></dt></dl></section><section><header><h3id="monadic-syntax"><ahref="#monadic-syntax"class="anchor"></a>Monadic syntax</h3></header><div><divclass="spec include"><divclass="doc"><detailsopen="open"><summary><spanclass="def"><code><spanclass="keyword">include</span><spanclass="keyword">module</span><spanclass="keyword">type</span><spanclass="keyword">of</span><ahref="../../IStdlib/IResult/index.html#module-Let_syntax">IStdlib.IResult.Let_syntax</a></code></span></summary><div><divclass="spec include"><divclass="doc"><detailsopen="open"><summary><spanclass="def"><code><spanclass="keyword">include</span><spanclass="keyword">module</span><spanclass="keyword">type</span><spanclass="keyword">of</span><ahref="../../IStdlib/index.html#module-IStd">IStdlib.IStd</a>.Result.Monad_infix</code></span></summary><dl><dtclass="spec value"id="val-(>>=)"><ahref="#val-(>>=)"class="anchor"></a><code><spanclass="keyword">val</span> (>>=) : <span><span>(<spanclass="type-var">'a</span>,<spanclass="type-var">'e</span>)</span> Core_kernel__Result.t</span><span>-></span><span>(<spanclass="type-var">'a</span><span>-></span><span><span>(<spanclass="type-var">'b</span>,<spanclass="type-var">'e</span>)</span> Core_kernel__Result.t</span>)</span><span>-></span><span><span>(<spanclass="type-var">'b</span>,<spanclass="type-var">'e</span>)</span> Core_kernel__Result.t</span></code></dt><dtclass="spec value"id="val-(>>|)"><ahref="#val-(>>|)"class="anchor"></a><code><spanclass="keyword">val</span> (>>|) : <span><span>(<spanclass="type-var">'a</span>,<spanclass="type-var">'e</span>)</span> Core_kernel__Result.t</span><span>-></span><span>(<spanclass="type-var">'a</span><span>-></span><spanclass="type-var">'b</span>)</span><span>-></span><span><span>(<spanclass="type-var">'b</span>,<spanclass="type-var">'e</span>)</span> Core_kernel__Result.t</span></code></dt></dl></details></div></div></div><dl><dtclass="spec value"id="val-let+"><ahref="#val-let+"class="anchor"></a><code><spanclass="keyword">val</span> let+ : <span><span>(<spanclass="type-var">'ok</span>,<spanclass="type-var">'err</span>)</span><ahref="../../IStdlib/index.html#module-IStd">IStdlib.IStd</a>.result</span><span>-></span><span>(<spanclass="type-var">'ok</span><span>-></span><spanclass="type-var">'okk</span>)</span><span>-></span><span><span>(<spanclass="type-var">'okk</span>,<spanclass="type-var">'err</span>)</span><ahref="../../IStdlib/index.html#module-IStd">IStdlib.IStd</a>.result</span></code></dt><dtclass="spec value"id="val-let*"><ahref="#val-let*"class="anchor"></a><code><spanclass="keyword">val</span> let* : <span><span>(<spanclass="type-var">'ok</span>,<spanclass="type-var">'err</span>)</span><ahref="../../IStdlib/index.html#module-IStd">IStdlib.IStd</a>.result</span><span>-></span><span>(<spanclass="type-var">'ok</span><span>-></span><span><span>(<spanclass="type-var">'okk</span>,<spanclass="type-var">'err</span>)</span><ahref="../../IStdlib/index.html#module-IStd">IStdlib.IStd</a>.result</span>)</span><span>-></span><span><span>(<spanclass="type-var">'okk</span>,<spanclass="type-var">'err</span>)</span><ahref="../../IStdlib/index.html#module-IStd">IStdlib.IStd</a>.result</span></code></dt></dl></details></div></div></div><dl><dtclass="spec value"id="val-let<*>"><ahref="#val-let<*>"class="anchor"></a><code><spanclass="keyword">val</span> let<*> : <span><spanclass="type-var">'a</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span><span>-></span><span>(<spanclass="type-var">'a</span><span>-></span><span><span><spanclass="type-var">'b</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span> list</span>)</span><span>-></span><span><span><spanclass="type-var">'b</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span> list</span></code></dt><dd><p>monadic "bind" but not really that turns an <code>AccessResult.t</code> into a list of <code>AccessResult.t</code>s (not really because the first type is not an <code>AccessResult.t list</code> but just an <code>AccessResult.t</code>)</p></dd></dl><dl><dtclass="spec value"id="val-let<+>"><ahref="#val-let<+>"class="anchor"></a><code><spanclass="keyword">val</span> let<+> : <span><spanclass="type-var">'a</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span><span>-></span><span>(<spanclass="type-var">'a</span><span>-></span><spanclass="type-var">'abductive_domain_t</span>)</span><span>-></span><span><span><span><spanclass="type-var">'abductive_domain_t</span><ahref="index.html#type-execution_domain_base_t">execution_domain_base_t</a></span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span> list</span></code></dt><dd><p>monadic "map" but even less really that turns an <code>AccessResult.t</code> into an analysis result</p></dd></dl></section></details></div></div></div><dl><dtclass="spec type"id="type-t"><ahref="#type-t"class="anchor"></a><code><spanclass="keyword">type</span> t</code><code> = <ahref="../PulseAbductiveDomain/index.html#type-t">PulseDomainInterface.AbductiveDomain.t</a></code></dt></dl><dl><dtclass="spec value"id="val-check_addr_access"><ahref="#val-check_addr_access"class="anchor"></a><code><spanclass="keyword">val</span> check_addr_access : <ahref="index.html#type-access_mode">access_mode</a><span>-></span><ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><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="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>Check that the <code>address</code> is not known to be invalid</p></dd></dl><divclass="spec module"id="module-Closures"><ahref="#module-Closures"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Closures/index.html">Closures</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></div><dl><dtclass="spec value"id="val-eval"><ahref="#val-eval"class="anchor"></a><code><spanclass="keyword">val</span> eval : <ahref="index.html#type-access_mode">access_mode</a><span>-></span><ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../../IR/Exp/index.html#type-t">IR.Exp.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span>)</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>Use the stack and heap to evaluate the given expression down to an abstract address representing its value.</p><p>Return an error state if it traverses some known invalid address or if the end destination is known to be invalid.</p></dd></dl><dl><dtclass="spec value"id="val-eval_structure_isl"><ahref="#val-eval_structure_isl"class="anchor"></a><code><spanclass="keyword">val</span> eval_structure_isl : <ahref="index.html#type-access_mode">access_mode</a><span>-></span><ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../../IR/Exp/index.html#type-t">IR.Exp.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(bool * <span><span><span>(<ahref="index.html#type-t">t</a> * <span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span>)</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span> list</span>)</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>Similar to eval but apply to data structures and ISL abduction. Return a list of abduced states (ISLOk and ISLErs); The boolean indicates whether it is data structures or not.</p></dd></dl><dl><dtclass="spec value"id="val-prune"><ahref="#val-prune"class="anchor"></a><code><spanclass="keyword">val</span> prune : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><span>condition:<ahref="../../IR/Exp/index.html#type-t">IR.Exp.t</a></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dtclass="spec value"id="val-eval_deref"><ahref="#val-eval_deref"class="anchor"></a><code><spanclass="keyword">val</span> eval_deref : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../../IR/Exp/index.html#type-t">IR.Exp.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span>)</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>Like <code>eval</code> but evaluates <code>*exp</code>.</p></dd></dl><dl><dtclass="spec value"id="val-eval_deref_isl"><ahref="#val-eval_deref_isl"class="anchor"></a><code><spanclass="keyword">val</span> eval_deref_isl : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../../IR/Exp/index.html#type-t">IR.Exp.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span><span>(<ahref="index.html#type-t">t</a> * <span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span>)</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span> list</span></code></dt><dtclass="spec value"id="val-eval_access"><ahref="#val-eval_access"class="anchor"></a><code><spanclass="keyword">val</span> eval_access : <ahref="index.html#type-access_mode">access_mode</a><span>-></span><ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><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="../../Pulselib__PulseBaseMemory/index.html#module-Access">Pulselib.PulseDomainInterface.BaseMemory.Access</a>.t <span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span>)</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>Like <code>eval</code> but starts from an address instead of an expression, checks that it is valid, and if so dereferences it according to the access.</p></dd></dl><dl><dtclass="spec value"id="val-havoc_id"><ahref="#val-havoc_id"class="anchor"></a><code><spanclass="keyword">val</span> havoc_id : <ahref="../../IR/Ident/index.html#type-t">IR.Ident.t</a><span>-></span><ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.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-havoc_field"><ahref="#val-havoc_field"class="anchor"></a><code><spanclass="keyword">val</span> havoc_field : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><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="../../IR/Fieldname/index.html#type-t">IR.Fieldname.t</a><span>-></span><ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dtclass="spec value"id="val-realloc_pvar"><ahref="#val-realloc_pvar"class="anchor"></a><code><spanclass="keyword">val</span> realloc_pvar : <ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a><span>-></span><ahref="../../IR/Pvar/index.html#type-t">IR.Pvar.t</a><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><dtclass="spec value"id="val-write_id"><ahref="#val-write_id"class="anchor"></a><code><spanclass="keyword">val</span> write_id : <ahref="../../IR/Ident/index.html#type-t">IR.Ident.t</a><span>-></span><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="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-write_field"><ahref="#val-write_field"class="anchor"></a><code><spanclass="keyword">val</span> write_field : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><span>ref:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><ahref="../../IR/Fieldname/index.html#type-t">IR.Fieldname.t</a><span>-></span><span>obj:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>write the edge <code>ref --.field--> obj</code></p></dd></dl><dl><dtclass="spec value"id="val-write_arr_index"><ahref="#val-write_arr_index"class="anchor"></a><code><spanclass="keyword">val</span> write_arr_index : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><span>ref:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><span>index:<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a></span><span>-></span><span>obj:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>write the edge <code>ref[index]--> obj</code></p></dd></dl><dl><dtclass="spec value"id="val-write_deref"><ahref="#val-write_deref"class="anchor"></a><code><spanclass="keyword">val</span> write_deref : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><span>ref:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><span>obj:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>write the edge <code>ref --*--> obj</code></p></dd></dl><dl><dtclass="spec value"id="val-write_deref_biad_isl"><ahref="#val-write_deref_biad_isl"class="anchor"></a><code><spanclass="keyword">val</span> write_deref_biad_isl : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><span>ref:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><span><ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a><ahref="../../Absint/HilExp/Access/index.html#type-t">Absint.HilExp.Access.t</a></span><span>-></span><span>obj:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span> list</span></code></dt><dtclass="spec value"id="val-invalidate"><ahref="#val-invalidate"class="anchor"></a><code><spanclass="keyword">val</span> invalidate : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../PulseInvalidation/index.html#type-t">PulseBasicInterface.Invalidation.t</a><span>-></span><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="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>record that the address is invalid</p></dd></dl><dl><dtclass="spec value"id="val-invalidate_biad_isl"><ahref="#val-invalidate_biad_isl"class="anchor"></a><code><spanclass="keyword">val</span> invalidate_biad_isl : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../PulseInvalidation/index.html#type-t">PulseBasicInterface.Invalidation.t</a><span>-></span><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="index.html#type-t">t</a><span>-></span><span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span> list</span></code></dt><dd><p>record that the address is invalid. If the address has not been allocated, abduce ISL specs for both invalid (null, free, unint) and allocated heap.</p></dd></dl><dl><dtclass="spec value"id="val-allocate"><ahref="#val-allocate"class="anchor"></a><code><spanclass="keyword">val</span> allocate : <ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a><span>-></span><ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><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="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-add_dynamic_type"><ahref="#val-add_dynamic_type"class="anchor"></a><code><spanclass="keyword">val</span> add_dynamic_type : <ahref="../../IR/Typ/index.html#type-t">IR.Typ.t</a><span>-></span><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><dtclass="spec value"id="val-remove_allocation_attr"><ahref="#val-remove_allocation_attr"class="anchor"></a><code><spanclass="keyword">val</span> remove_allocation_attr : <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><dtclass="spec value"id="val-invalidate_access"><ahref="#val-invalidate_access"class="anchor"></a><code><spanclass="keyword">val</span> invalidate_access : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../PulseInvalidation/index.html#type-t">PulseBasicInterface.Invalidation.t</a><span>-></span><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="../../Pulselib__PulseBaseMemory/index.html#module-Access">Pulselib.PulseDomainInterface.BaseMemory.Access</a>.t <span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>record that what the address points via the access to is invalid</p></dd></dl><dl><dtclass="spec value"id="val-invalidate_array_elements"><ahref="#val-invalidate_array_elements"class="anchor"></a><code><spanclass="keyword">val</span> invalidate_array_elements : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../PulseInvalidation/index.html#type-t">PulseBasicInterface.Invalidation.t</a><span>-></span><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="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>record that all the array elements that address points to is invalid</p></dd></dl><dl><dtclass="spec value"id="val-shallow_copy"><ahref="#val-shallow_copy"class="anchor"></a><code><spanclass="keyword">val</span> shallow_copy : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><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="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span>)</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dd><p>returns the address of a new cell with the same edges as the original</p></dd></dl><dl><dtclass="spec value"id="val-get_dynamic_type_unreachable_values"><ahref="#val-get_dynamic_type_unreachable_values"class="anchor"></a><code><spanclass="keyword">val</span> get_dynamic_type_unreachable_values : <span><ahref="../../IR/Var/index.html#type-t">IR.Var.t</a> list</span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="../../IR/Var/index.html#type-t">IR.Var.t</a> * <ahref="../../IR/Typ/index.html#type-t">IR.Typ.t</a>)</span> list</span></code></dt><dd><p>Given a list of variables, computes the unreachable values if the variables were removed from the stack, then return the dynamic types of those values if they are available</p></dd></dl><dl><dtclass="spec value"id="val-remove_vars"><ahref="#val-remove_vars"class="anchor"></a><code><spanclass="keyword">val</span> remove_vars : <ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a><span>-></span><span><ahref="../../IR/Var/index.html#type-t">IR.Var.t</a> list</span><span>-></span><ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dtclass="spec value"id="val-check_address_escape"><ahref="#val-check_address_escape"class="anchor"></a><code><spanclass="keyword">val</span> check_address_escape : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../../IR/Procdesc/index.html#type-t">IR.Procdesc.t</a><span>-></span><ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a><span>-></span><ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt><dtclass="spec value"id="val-get_captured_actuals"><ahref="#val-get_captured_actuals"class="anchor"></a><code><spanclass="keyword">val</span> get_captured_actuals : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><span>captured_vars:<span><span>(<ahref="../../IR/Var/index.html#type-t">IR.Var.t</a> * <ahref="../../IR/CapturedVar/index.html#type-capture_mode">IR.CapturedVar.capture_mode</a> * <ahref="../../IR/Typ/index.html#type-t">IR.Typ.t</a>)</span> list</span></span><span>-></span><span>actual_closure:<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <span><span>(<ahref="../../IR/Var/index.html#type-t">IR.Var.t</a> * <span>(<span>(<ahref="../PulseAbstractValue/index.html#type-t">PulseBasicInterface.AbstractValue.t</a> * <ahref="../PulseValueHistory/index.html#type-t">PulseBasicInterface.ValueHistory.t</a>)</span> * <ahref="../../IR/Typ/index.html#type-t">IR.Typ.t</a>)</span>)</span> list</span>)</span><ahref="../PulseAccessResult/index.html#type-t">PulseDomainInterface.AccessResult.t</a></span></code></dt></dl></div></body></html>