Reviewed By: mbouaziz Differential Revision: D3838520 fbshipit-source-id: 7cd8bcbmaster
							parent
							
								
									f1c10738c5
								
							
						
					
					
						commit
						55a46d1211
					
				| @ -0,0 +1,113 @@ | ||||
| (* | ||||
|  * 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. | ||||
|  *) | ||||
| 
 | ||||
| (** summary type for Quandary taint analysis *) | ||||
| 
 | ||||
| open! Utils | ||||
| 
 | ||||
| module F = Format | ||||
| module L = Logging | ||||
| 
 | ||||
| type input = | ||||
|   | In_formal of int * AccessPath.t | ||||
|   (** input flows via parameter at given index at offset in given access path *) | ||||
|   | In_global of AccessPath.t | ||||
|   (** input flows from global at offset in given access path *) | ||||
|   | In_empty | ||||
|   (** no input value *) | ||||
| 
 | ||||
| type output = | ||||
|   | Out_formal of int * AccessPath.t | ||||
|   (** output flows into parameter at given index at offset in given access path *) | ||||
|   | Out_global of AccessPath.t | ||||
|   (** output flows into global at offset in given access path *) | ||||
|   | Out_return of AccessPath.t | ||||
|   (** output flows into return value at offset in given access path *) | ||||
| 
 | ||||
| (** enumeration of all the different trace types that are possible (just Java, for now). needed | ||||
|     because we can't functorize Specs.summary's *) | ||||
| type summary_trace = | ||||
|   | Java of JavaTrace.t | ||||
|   | Unknown | ||||
| 
 | ||||
| (** input-output summary for a pair of values. intuitively, read it as | ||||
|     "if [input] is associated with trace T before the call, then [output] is | ||||
|     associated with trace (T + [output_trace]) after the call" (where `+` denotes trace | ||||
|     concatenation). *) | ||||
| type in_out_summary = | ||||
|   { | ||||
|     input : input; | ||||
|     output : output; | ||||
|     output_trace : summary_trace; | ||||
|   } | ||||
| 
 | ||||
| type t = in_out_summary list | ||||
| 
 | ||||
| module type Trace = sig | ||||
|   include Trace.S | ||||
| 
 | ||||
|   val to_summary_trace : t -> summary_trace | ||||
| 
 | ||||
|   val of_summary_trace : summary_trace -> t | ||||
| end | ||||
| 
 | ||||
| let make_formal_input index access_path = | ||||
|   In_formal (index, access_path) | ||||
| 
 | ||||
| let make_global_input access_path = | ||||
|   In_global access_path | ||||
| 
 | ||||
| let empty_input = In_empty | ||||
| 
 | ||||
| let make_formal_output index access_path = | ||||
|   Out_formal (index, access_path) | ||||
| 
 | ||||
| let make_global_output access_path = | ||||
|   Out_global access_path | ||||
| 
 | ||||
| let make_return_output access_path = | ||||
|   Out_return access_path | ||||
| 
 | ||||
| let make_in_out_summary input output output_trace = | ||||
|   { input; output; output_trace; } | ||||
| 
 | ||||
| let pp_trace fmt = function | ||||
|   | Java trace -> JavaTrace.pp fmt trace | ||||
|   | Unknown -> assert false | ||||
| 
 | ||||
| let pp_input fmt = function | ||||
|   | In_formal (index, access_path) -> F.fprintf fmt "%a (formal %d)" AccessPath.pp access_path index | ||||
|   | In_global access_path -> F.fprintf fmt "%a (global)" AccessPath.pp access_path | ||||
|   | In_empty -> F.fprintf fmt "_" | ||||
| 
 | ||||
| let pp_output fmt = function | ||||
|   | Out_formal (index, access_path) -> | ||||
|       F.fprintf fmt "%a (formal %d)" AccessPath.pp access_path index | ||||
|   | Out_global access_path -> | ||||
|       F.fprintf fmt "%a (global)" AccessPath.pp access_path | ||||
|   | Out_return access_path -> | ||||
|       F.fprintf fmt "%a (return)" AccessPath.pp access_path | ||||
| 
 | ||||
| let pp_in_out_summary fmt summary = | ||||
|   match summary.input with | ||||
|   | In_empty -> | ||||
|       F.fprintf fmt | ||||
|         "%a => (%a, %a)" | ||||
|         pp_input summary.input | ||||
|         pp_output summary.output | ||||
|         pp_trace summary.output_trace | ||||
|   | In_formal _ | In_global _ -> | ||||
|       F.fprintf fmt | ||||
|         "(%a, T) => (%a, T :: %a)" | ||||
|         pp_input summary.input | ||||
|         pp_output summary.output | ||||
|         pp_trace summary.output_trace | ||||
| 
 | ||||
| let pp fmt t = | ||||
|   PrettyPrintable.pp_collection ~pp_item:pp_in_out_summary fmt t | ||||
| @ -0,0 +1,83 @@ | ||||
| (* | ||||
|  * 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. | ||||
|  *) | ||||
| 
 | ||||
| 
 | ||||
| (** summary type for Quandary taint analysis *) | ||||
| 
 | ||||
| module F = Format | ||||
| 
 | ||||
| type input = | ||||
|   private | ||||
|   | In_formal of int * AccessPath.t | ||||
|   (** input flows via parameter at given index at offset in given access path *) | ||||
|   | In_global of AccessPath.t | ||||
|   (** input flows from global at offset in given access path *) | ||||
|   | In_empty | ||||
|   (** no input value *) | ||||
| 
 | ||||
| type output = | ||||
|   private | ||||
|   | Out_formal of int * AccessPath.t | ||||
|   (** output flows into parameter at given index at offset in given access path *) | ||||
|   | Out_global of AccessPath.t | ||||
|   (** output flows into global at offset in given access path *) | ||||
|   | Out_return of AccessPath.t | ||||
|   (** output flows into return value at offset in given access path *) | ||||
| 
 | ||||
| (** enumeration of all the different trace types that are possible (just Java, for now). needed | ||||
|     because we can't functorize Specs.summary's *) | ||||
| type summary_trace = | ||||
|   | Java of JavaTrace.t | ||||
|   | Unknown | ||||
| 
 | ||||
| (** input-output summary for a pair of values. intuitively, read it as | ||||
|     "if [input] is associated with trace T before the call, then [output] is | ||||
|     associated with trace (T + [output_trace]) after the call" (where `+` denotes trace | ||||
|     concatenation). *) | ||||
| type in_out_summary = | ||||
|   private | ||||
|   { | ||||
|     input : input; | ||||
|     output : output; | ||||
|     output_trace : summary_trace; | ||||
|   } | ||||
| 
 | ||||
| type t = in_out_summary list | ||||
| 
 | ||||
| module type Trace = sig | ||||
|   include Trace.S | ||||
| 
 | ||||
|   val to_summary_trace : t -> summary_trace | ||||
| 
 | ||||
|   val of_summary_trace : summary_trace -> t | ||||
| end | ||||
| 
 | ||||
| val make_formal_input : int -> AccessPath.t -> input | ||||
| 
 | ||||
| val make_global_input : AccessPath.t -> input | ||||
| 
 | ||||
| val empty_input : input | ||||
| 
 | ||||
| val make_formal_output : int -> AccessPath.t -> output | ||||
| 
 | ||||
| val make_global_output : AccessPath.t -> output | ||||
| 
 | ||||
| val make_return_output : AccessPath.t -> output | ||||
| 
 | ||||
| val make_in_out_summary : input -> output -> summary_trace -> in_out_summary | ||||
| 
 | ||||
| val pp_trace : F.formatter -> summary_trace -> unit | ||||
| 
 | ||||
| val pp_input : F.formatter -> input -> unit | ||||
| 
 | ||||
| val pp_output : F.formatter -> output -> unit | ||||
| 
 | ||||
| val pp_in_out_summary : F.formatter -> in_out_summary -> unit | ||||
| 
 | ||||
| val pp : F.formatter -> t -> unit | ||||
					Loading…
					
					
				
		Reference in new issue