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.InferModules.PulseOperations)</title><linkrel="stylesheet"href="../../../odoc.css"/><metacharset="utf-8"/><metaname="generator"content="odoc %%VERSION%%"/><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">InferModules</a>» PulseOperations</nav><h1>Module <code>InferModules.PulseOperations</code></h1></header><divclass="spec module"id="module-AbstractAddress"><ahref="#module-AbstractAddress"class="anchor"></a><code><spanclass="keyword">module</span> AbstractAddress = <ahref="../PulseDomain/index.html#module-AbstractAddress">PulseDomain.AbstractAddress</a></code></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">PulseAbductiveDomain.t</a></code></dt><dtclass="spec type"id="type-access_result"><ahref="#type-access_result"class="anchor"></a><code><spanclass="keyword">type</span><span>'a access_result</span></code><code> = <span><span>(<spanclass="type-var">'a</span>,<ahref="../PulseDiagnostic/index.html#type-t">PulseDiagnostic.t</a>)</span><ahref="../../../InferStdlib/InferStdlib/index.html#module-IStd">InferStdlib.IStd</a>.result</span></code></dt></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="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><ahref="../../../InferIR/InferIR/Exp/index.html#type-t">InferIR.Exp.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a>)</span><ahref="index.html#type-access_result">access_result</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_deref"><ahref="#val-eval_deref"class="anchor"></a><code><spanclass="keyword">val</span> eval_deref : <ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><ahref="../../../InferIR/InferIR/Exp/index.html#type-t">InferIR.Exp.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a>)</span><ahref="index.html#type-access_result">access_result</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_access"><ahref="#val-eval_access"class="anchor"></a><code><spanclass="keyword">val</span> eval_access : <ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a><span>-></span><ahref="../../InferModules__PulseDomain/Memory/index.html#module-Access">InferModules.PulseDomain.Memory.Access</a>.t <span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a>)</span><ahref="index.html#type-access_result">access_result</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="../../../InferIR/InferIR/Ident/index.html#type-t">InferIR.Ident.t</a><span>-></span><ahref="../PulseDomain/ValueHistory/index.html#type-t">PulseDomain.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_deref"><ahref="#val-havoc_deref"class="anchor"></a><code><spanclass="keyword">val</span> havoc_deref : <ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a><span>-></span><ahref="../PulseDomain/ValueHistory/index.html#type-t">PulseDomain.ValueHistory.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="index.html#type-access_result">access_result</a></span></code></dt><dtclass="spec value"id="val-havoc_field"><ahref="#val-havoc_field"class="anchor"></a><code><spanclass="keyword">val</span> havoc_field : <ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a><span>-></span><ahref="../../../InferIR/InferIR/Typ/Fieldname/index.html#type-t">InferIR.Typ.Fieldname.t</a><span>-></span><ahref="../PulseDomain/ValueHistory/index.html#type-t">PulseDomain.ValueHistory.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="index.html#type-access_result">access_result</a></span></code></dt><dtclass="spec value"id="val-realloc_var"><ahref="#val-realloc_var"class="anchor"></a><code><spanclass="keyword">val</span> realloc_var : <ahref="../../../InferIR/InferIR/Var/index.html#type-t">InferIR.Var.t</a><span>-></span><ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.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="../../../InferIR/InferIR/Ident/index.html#type-t">InferIR.Ident.t</a><span>-></span><ahref="../PulseDomain/Stack/index.html#type-value">PulseDomain.Stack.value</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_deref"><ahref="#val-write_deref"class="anchor"></a><code><spanclass="keyword">val</span> write_deref : <ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><span>ref:<ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a></span><span>-></span><span>obj:<ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="index.html#type-access_result">access_result</a></span></code></dt><dd><p>write the edge <code>ref --*--> obj</code></p></dd></dl><dl><dtclass="spec value"id="val-invalidate"><ahref="#val-invalidate"class="anchor"></a><code><spanclass="keyword">val</span> invalidate : <ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><span><ahref="../PulseDomain/Invalidation/index.html#type-t">PulseDomain.Invalidation.t</a><ahref="../PulseDomain/InterprocAction/index.html#type-t">PulseDomain.InterprocAction.t</a></span><span>-></span><ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="index.html#type-access_result">access_result</a></span></code></dt><dd><p>record that the address is invalid</p></dd></dl><dl><dtclass="spec value"id="val-invalidate_deref"><ahref="#val-invalidate_deref"class="anchor"></a><code><spanclass="keyword">val</span> invalidate_deref : <ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><span><ahref="../PulseDomain/Invalidation/index.html#type-t">PulseDomain.Invalidation.t</a><ahref="../PulseDomain/InterprocAction/index.html#type-t">PulseDomain.InterprocAction.t</a></span><span>-></span><ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="index.html#type-access_result">access_result</a></span></code></dt><dd><p>record that what the address points 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="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><span><ahref="../PulseDomain/Invalidation/index.html#type-t">PulseDomain.Invalidation.t</a><ahref="../PulseDomain/InterprocAction/index.html#type-t">PulseDomain.InterprocAction.t</a></span><span>-></span><ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="index.html#type-access_result">access_result</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="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><ahref="../PulseDomain/AddrTracePair/index.html#type-t">PulseDomain.AddrTracePair.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span>(<ahref="index.html#type-t">t</a> * <ahref="../../InferModules__PulseDomain/AbstractAddress/index.html#type-t">AbstractAddress.t</a>)</span><ahref="index.html#type-access_result">access_result</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-remove_vars"><ahref="#val-remove_vars"class="anchor"></a><code><spanclass="keyword">val</span> remove_vars : <span><ahref="../../../InferIR/InferIR/Var/index.html#type-t">InferIR.Var.t</a> list</span><span>-></span><ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.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-check_address_escape"><ahref="#val-check_address_escape"class="anchor"></a><code><spanclass="keyword">val</span> check_address_escape : <ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><ahref="../../../InferIR/InferIR/Procdesc/index.html#type-t">InferIR.Procdesc.t</a><span>-></span><ahref="../../InferModules__PulseDomain/AbstractAddress/index.html#type-t">AbstractAddress.t</a><span>-></span><ahref="../PulseDomain/ValueHistory/index.html#type-t">PulseDomain.ValueHistory.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#type-t">t</a><ahref="index.html#type-access_result">access_result</a></span></code></dt><dtclass="spec value"id="val-call"><ahref="#val-call"class="anchor"></a><code><spanclass="keyword">val</span> call : <span>caller_summary:<ahref="../Summary/index.html#type-t">Summary.t</a></span><span>-></span><ahref="../../../InferBase/InferBase/Location/index.html#type-t">InferBase.Location.t</a><span>-></span><ahref="../../../InferIR/InferIR/Typ/Procname/index.html#type-t">InferIR.Typ.Procname.t</a><span>-></span><span>ret:<span>(<ahref="../../../InferIR/InferIR/Ident/index.html#type-t">InferIR.Ident.t</a> * <ahref="../../../InferIR/InferIR/Typ/index.html#type-t">InferIR.Typ.t</a>)</span></span><span>-></span><span>actuals:<span><span>(<span>(<ahref="../../InferModules__PulseDomain/AbstractAddress/index.html#type-t">AbstractAddress.t</a> * <ahref="../PulseDomain/ValueHistory/index.html#type-t">PulseDomain.ValueHistory.t</a>)</span> * <ahref="../../../InferIR/InferIR/Typ/index.html#type-t">InferIR.Typ.t</a>)</span> list</span></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span><span><ahref="index.html#type-t">t</a> list</span><ahref="index.html#type-access_result">access_result</a></span></code></dt><dd><p>perform an interprocedural call: apply the summary for the call proc name passed as argument if it exists</p></dd></dl></div></body></html>