package mopsa
MOPSA: A Modular and Open Platform for Static Analysis using Abstract Interpretation
Install
Dune Dependency
Authors
Maintainers
Sources
mopsa-analyzer-v1.0.tar.gz
md5=9f673f79708b44a7effb3b6bb3618d2c
sha512=cb91cb428e43a22f1abbcb8219710d0c10a5b3756d0da392d4084b3b3a6157350776c596983e63def344f617d39964e91f244f60c07958695ee5c8c809a9f0f4
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
(****************************************************************************) (* *) (* 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 (** Computation of post-conditions *) (** ============================== *) let exec stmt man flow = let range = stmt.srange in match skind stmt with | S_return (Some e) -> let call = find_ctx return_key (Flow.get_ctx flow) in let ret = mk_return call (Some range) 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 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 call_oexp = match f.fun_return_type with | None -> None | Some _ -> Some exp in Some ( post >>% fun flow -> inline f params locals body call_oexp range man flow |> (* FIXME: we only keep intra-procedural effects for the moment *) Cases.set_effects empty_teffect ) | _ -> 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)"
>