Reviewed By: dkgi Differential Revision: D2996626 fb-gh-sync-id: 997531b shipit-source-id: 997531bmaster
							parent
							
								
									d499d5fc8e
								
							
						
					
					
						commit
						177574c29e
					
				| @ -0,0 +1,58 @@ | |||||||
|  | (* | ||||||
|  |  * Copyright (c) 2016 - present Facebook, Inc. | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * This source code is licensed under the BSD style license found in the | ||||||
|  |  * LICENSE file in the root directory of this source tree. An additional grant | ||||||
|  |  * of patent rights can be found in the PATENTS file in the same directory. | ||||||
|  |  *) | ||||||
|  | 
 | ||||||
|  | module F = Format | ||||||
|  | 
 | ||||||
|  | module type AbstractDomain = sig | ||||||
|  |   type astate | ||||||
|  | 
 | ||||||
|  |   val init : astate (* the initial state *) | ||||||
|  |   val bot : astate | ||||||
|  |   val is_bot : astate -> bool | ||||||
|  |   val lteq : astate -> astate -> bool (* fst \sqsubseteq snd? *) | ||||||
|  |   val join : astate -> astate -> astate | ||||||
|  |   val widen : astate -> astate -> astate | ||||||
|  |   val pp : F.formatter -> astate -> unit | ||||||
|  | 
 | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | module BotLiftedAbstractDomain (A : AbstractDomain) = struct | ||||||
|  |   type astate = | ||||||
|  |     | Bot | ||||||
|  |     | NonBot of A.astate | ||||||
|  | 
 | ||||||
|  |   let bot = Bot | ||||||
|  | 
 | ||||||
|  |   let is_bot astate = | ||||||
|  |     astate = Bot | ||||||
|  | 
 | ||||||
|  |   let init = NonBot A.init | ||||||
|  | 
 | ||||||
|  |   let lteq astate1 astate2 = match astate1, astate2 with | ||||||
|  |     | Bot, _ -> true | ||||||
|  |     | _ , Bot -> false | ||||||
|  |     | NonBot a1, NonBot a2 -> A.lteq a1 a2 | ||||||
|  | 
 | ||||||
|  |   let join astate1 astate2 = | ||||||
|  |     match astate1, astate2 with | ||||||
|  |     | Bot, _ -> astate2 | ||||||
|  |     | _, Bot -> astate1 | ||||||
|  |     | NonBot a1, NonBot a2 -> NonBot (A.join a1 a2) | ||||||
|  | 
 | ||||||
|  |   let widen astate1 astate2 = | ||||||
|  |     match astate1, astate2 with | ||||||
|  |     | Bot, _ -> astate2 | ||||||
|  |     | _, Bot -> astate1 | ||||||
|  |     | NonBot a1, NonBot a2 -> NonBot (A.widen a1 a2) | ||||||
|  | 
 | ||||||
|  |   let pp fmt = function | ||||||
|  |     | Bot -> F.fprintf fmt "_|_" | ||||||
|  |     | NonBot astate -> A.pp fmt astate | ||||||
|  | 
 | ||||||
|  | end | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | (* | ||||||
|  |  * Copyright (c) 2016 - present Facebook, Inc. | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * This source code is licensed under the BSD style license found in the | ||||||
|  |  * LICENSE file in the root directory of this source tree. An additional grant | ||||||
|  |  * of patent rights can be found in the PATENTS file in the same directory. | ||||||
|  |  *) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | module type TransferFunctions = sig | ||||||
|  |   type astate | ||||||
|  | 
 | ||||||
|  |   (* {A} instr {A'} *) | ||||||
|  |   val exec_instr : astate -> Sil.instr -> astate | ||||||
|  | 
 | ||||||
|  | end | ||||||
					Loading…
					
					
				
		Reference in new issue