package mopsa
MOPSA: A Modular and Open Platform for Static Analysis using Abstract Interpretation
Install
Dune Dependency
Authors
Maintainers
Sources
mopsa-analyzer-v1.1.tar.gz
md5=fdee20e988343751de440b4f6b67c0f4
sha512=f5cbf1328785d3f5ce40155dada2d95e5de5cce4f084ea30cfb04d1ab10cc9403a26cfb3fa55d0f9da72244482130fdb89c286a9aed0d640bba46b7c00e09500
doc/src/universal_interproc/inlining.ml.html
Source file inlining.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
(****************************************************************************) (* *) (* This file is part of MOPSA, a Modular Open Platform for Static Analysis. *) (* *) (* Copyright (C) 2017-2019 The MOPSA Project. *) (* *) (* This program is free software: you can redistribute it and/or modify *) (* it under the terms of the GNU Lesser General Public License as published *) (* by the Free Software Foundation, either version 3 of the License, or *) (* (at your option) any later version. *) (* *) (* This program is distributed in the hope that it will be useful, *) (* but WITHOUT ANY WARRANTY; without even the implied warranty of *) (* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) (* GNU Lesser General Public License for more details. *) (* *) (* You should have received a copy of the GNU Lesser General Public License *) (* along with this program. If not, see <http://www.gnu.org/licenses/>. *) (* *) (****************************************************************************) (** Inter-procedural iterator by inlining. *) open Mopsa open Sig.Abstraction.Stateless open Ast open Common (** {2 Domain definition} *) (** ===================== *) module Domain = struct (** Domain identification *) (** ===================== *) include GenStatelessDomainId(struct let name = "universal.iterators.interproc.inlining" end) let checks = [] (** Command-line options *) (** ==================== *) let () = import_shared_option "universal.iterators.interproc.common.renaming" name (** Initialization *) (** ============== *) let init prog man (flow: 'a flow) = Flow.set_ctx ( Flow.get_ctx flow |> add_ctx Context.callstack_ctx_key empty_callstack ) flow |> Post.return |> Option.some (** Computation of post-conditions *) (** ============================== *) let exec stmt man flow = let range = stmt.srange in match skind stmt with | S_return (Some e) -> let ret = find_ctx return_key (Flow.get_ctx flow) in let flow = man.exec (mk_add_marker (M_return range) range) flow |> post_to_flow man in man.exec (mk_add_var ret range) flow >>%? fun flow -> man.exec (mk_assign (mk_var ret range) e range) flow >>%? fun flow -> let cur = Flow.get T_cur man.lattice flow in Flow.add (T_return (range)) cur man.lattice flow |> Flow.remove T_cur |> Post.return |> OptionExt.return | S_return None -> let flow = man.exec (mk_add_marker (M_return range) range) flow |> post_to_flow man in let cur = Flow.get T_cur man.lattice flow in Flow.add (T_return range) cur man.lattice flow |> Flow.remove T_cur |> Post.return |> OptionExt.return | _ -> None (** Evaluation of expressions *) (** ========================= *) let eval exp man flow = let range = erange exp in match ekind exp with | E_call({ekind = E_function (User_defined f)}, args) -> if man.lattice.is_bottom (Flow.get T_cur man.lattice flow) then Cases.empty flow |> OptionExt.return else let params, locals, body, post = init_fun_params f args range man flow in let ret = match f.fun_return_type with | None -> None | Some _ -> match f.fun_return_var with | Some v -> Some v | None -> Some (mk_return exp) in post >>% inline f params locals body ret range man |> Option.some | _ -> None let ask _ _ _ = None let print_expr _ _ _ _ = () end let () = register_stateless_domain (module Domain)
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>