Reviewed By: ezgicicek Differential Revision: D13449611 fbshipit-source-id: 6b6170f56master
							parent
							
								
									bb1a19b6f9
								
							
						
					
					
						commit
						e5e7237d9d
					
				| @ -0,0 +1,80 @@ | ||||
| (* | ||||
|  * Copyright (c) 2017-present, Facebook, Inc. | ||||
|  * | ||||
|  * This source code is licensed under the MIT license found in the | ||||
|  * LICENSE file in the root directory of this source tree. | ||||
|  *) | ||||
| 
 | ||||
| open! IStd | ||||
| open AbsLoc | ||||
| module BoUtils = BufferOverrunUtils | ||||
| module Dom = BufferOverrunDomain | ||||
| 
 | ||||
| type model_env = BufferOverrunModels.model_env = | ||||
|   { pname: Typ.Procname.t | ||||
|   ; node_hash: int | ||||
|   ; location: Location.t | ||||
|   ; tenv: Tenv.t | ||||
|   ; integer_type_widths: Typ.IntegerWidths.t } | ||||
| 
 | ||||
| type declare_local_fun = | ||||
|      decl_local:BoUtils.Exec.decl_local | ||||
|   -> model_env | ||||
|   -> Loc.t | ||||
|   -> inst_num:int | ||||
|   -> represents_multiple_values:bool | ||||
|   -> dimension:int | ||||
|   -> Dom.Mem.t | ||||
|   -> Dom.Mem.t * int | ||||
| 
 | ||||
| type declare_symbolic_fun = | ||||
|      decl_sym_val:BoUtils.Exec.decl_sym_val | ||||
|   -> Itv.SymbolPath.partial | ||||
|   -> model_env | ||||
|   -> depth:int | ||||
|   -> Loc.t | ||||
|   -> Dom.Mem.t | ||||
|   -> Dom.Mem.t | ||||
| 
 | ||||
| type typ_model = {declare_local: declare_local_fun; declare_symbolic: declare_symbolic_fun} | ||||
| 
 | ||||
| let std_array typ length = | ||||
|   let declare_local ~decl_local {pname; node_hash; location} loc ~inst_num | ||||
|       ~represents_multiple_values ~dimension mem = | ||||
|     (* should this be deferred to the constructor? *) | ||||
|     let length = Some (IntLit.of_int64 length) in | ||||
|     BoUtils.Exec.decl_local_array ~decl_local pname ~node_hash location loc typ ~length ~inst_num | ||||
|       ~represents_multiple_values ~dimension mem | ||||
|   in | ||||
|   let declare_symbolic ~decl_sym_val path {pname; tenv; location} ~depth loc mem = | ||||
|     let offset = Itv.zero in | ||||
|     let size = Itv.of_int64 length in | ||||
|     BoUtils.Exec.decl_sym_arr ~decl_sym_val Symb.SymbolPath.Deref_ArrayIndex pname path tenv | ||||
|       location ~depth loc typ ~offset ~size mem | ||||
|   in | ||||
|   {declare_local; declare_symbolic} | ||||
| 
 | ||||
| 
 | ||||
| (* Java's Collections are represented by their size. We don't care about the elements. | ||||
| - when they are constructed, we set the size to 0 | ||||
| - each time we add an element, we increase the length of the array | ||||
| - each time we delete an element, we decrease the length of the array *) | ||||
| 
 | ||||
| let collection = | ||||
|   let declare_local ~decl_local:_ {pname; node_hash; location} loc ~inst_num | ||||
|       ~represents_multiple_values ~dimension mem = | ||||
|     BoUtils.Exec.decl_local_collection pname ~node_hash location loc ~inst_num | ||||
|       ~represents_multiple_values ~dimension mem | ||||
|   in | ||||
|   let declare_symbolic ~decl_sym_val:_ path {location} ~depth:_ loc mem = | ||||
|     BoUtils.Exec.decl_sym_collection path location loc mem | ||||
|   in | ||||
|   {declare_local; declare_symbolic} | ||||
| 
 | ||||
| 
 | ||||
| let dispatch : (Tenv.t, typ_model) ProcnameDispatcher.TypName.dispatcher = | ||||
|   let open ProcnameDispatcher.TypName in | ||||
|   make_dispatcher | ||||
|     [ -"std" &:: "array" < capt_typ `T &+ capt_int >--> std_array | ||||
|     ; +PatternMatch.implements_collection &::.*--> collection | ||||
|     ; +PatternMatch.implements_iterator &::.*--> collection ] | ||||
					Loading…
					
					
				
		Reference in new issue