package mopsa

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file intervals_congruences.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
(****************************************************************************)
(*                                                                          *)
(* 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/>.    *)
(*                                                                          *)
(****************************************************************************)

(** Reduction operator for intervals and congruences. *)

open Mopsa
open Sig.Reduction.Value



module Reduction =
struct

  let name = "universal.numeric.reductions.intervals_congruences"
  let debug fmt = Debug.debug ~channel:name fmt

  module I = Values.Intervals.Integer.Value
  module C = Values.Congruences.Value


  (* Reduce a congruence and an interval *)
  let meet_cgr_itv c i =
    match c, i with
    | Bot.BOT, _ | _, Bot.BOT -> (C.bottom, I.bottom)

    | Bot.Nb a, Bot.Nb b ->
      match CongUtils.IntCong.meet_inter a b with
      | Bot.BOT -> (C.bottom, I.bottom)

      | Bot.Nb (a', b') ->
        let c' = Bot.Nb a'
        and i' = Bot.Nb b' in
        (c', i')

  (* Reduction operator *)
  let reduce (man: 'a value_reduction_man) (v: 'a) : 'a =
    let c = man.get C.id v
    and i = man.get I.id v in

    let c', i' = meet_cgr_itv c i in

    man.set I.id i' v |>
    man.set C.id c'
end


let () =
  register_value_reduction (module Reduction)
OCaml

Innovation. Community. Security.