@@ -109,6 +109,41 @@ module Backward = struct
109109 && BackwardState. less_or_equal ~left: tito_next ~right: tito_previous
110110end
111111
112+ module Sanitizers = struct
113+ type model = {
114+ (* Sanitizers applying to all parameters and the return value. *)
115+ global : Sanitize .t ;
116+ (* Map from parameter or return value to sanitizers. *)
117+ roots : SanitizeRootMap .t ;
118+ }
119+
120+ let pp_model formatter { global; roots } =
121+ Format. fprintf
122+ formatter
123+ " Global Sanitizer: %s\n Sanitizers: %s"
124+ (json_to_string ~indent: " " (Sanitize. to_json global))
125+ (json_to_string ~indent: " " (SanitizeRootMap. to_json roots))
126+
127+
128+ let show_model = Format. asprintf " %a" pp_model
129+
130+ let empty = { global = Sanitize. empty; roots = SanitizeRootMap. bottom }
131+
132+ let is_empty_model { global; roots } = Sanitize. is_empty global && SanitizeRootMap. is_bottom roots
133+
134+ let join
135+ { global = global_left ; roots = roots_left }
136+ { global = global_right ; roots = roots_right }
137+ =
138+ {
139+ global = Sanitize. join global_left global_right;
140+ roots = SanitizeRootMap. join roots_left roots_right;
141+ }
142+
143+
144+ let widen ~iteration :_ ~previous ~next = join previous next
145+ end
146+
112147module Mode = struct
113148 let name = " modes"
114149
@@ -150,19 +185,20 @@ end
150185type call_model = {
151186 forward : Forward .model ;
152187 backward : Backward .model ;
153- sanitize : Sanitize .t ;
188+ sanitizers : Sanitizers .model ;
154189 modes : ModeSet .t ;
155190}
156191
157- let pp_call_model formatter { forward; backward; sanitize ; modes } =
192+ let pp_call_model formatter { forward; backward; sanitizers ; modes } =
158193 Format. fprintf
159194 formatter
160- " %a\n %a\n Sanitize: %s \n %a"
195+ " %a\n %a\n %a \n %a"
161196 Forward. pp_model
162197 forward
163198 Backward. pp_model
164199 backward
165- (Sanitize. to_json sanitize |> json_to_string ~indent: " " )
200+ Sanitizers. pp_model
201+ sanitizers
166202 ModeSet. pp_model
167203 modes
168204
@@ -175,7 +211,7 @@ let empty_skip_model =
175211 {
176212 forward = Forward. empty;
177213 backward = Backward. empty;
178- sanitize = Sanitize . empty;
214+ sanitizers = Sanitizers . empty;
179215 modes = ModeSet. singleton SkipAnalysis ;
180216 }
181217
@@ -195,7 +231,7 @@ module ResultArgument = struct
195231 {
196232 forward = Forward. obscure;
197233 backward = Backward. obscure;
198- sanitize = Sanitize . empty;
234+ sanitizers = Sanitizers . empty;
199235 modes = ModeSet. singleton Obscure ;
200236 }
201237
@@ -204,29 +240,29 @@ module ResultArgument = struct
204240 {
205241 forward = Forward. empty;
206242 backward = Backward. empty;
207- sanitize = Sanitize . empty;
243+ sanitizers = Sanitizers . empty;
208244 modes = ModeSet. empty;
209245 }
210246
211247
212- let is_empty_model ~with_modes { forward; backward; sanitize ; modes } =
248+ let is_empty_model ~with_modes { forward; backward; sanitizers ; modes } =
213249 Forward. is_empty_model forward
214250 && Backward. is_empty_model backward
215- && Sanitize. is_empty sanitize
251+ && Sanitizers. is_empty_model sanitizers
216252 && ModeSet. equal with_modes modes
217253
218254
219- let should_externalize_model { forward; backward; sanitize ; _ } =
255+ let should_externalize_model { forward; backward; sanitizers ; _ } =
220256 (not (Forward. is_empty_model forward))
221257 || (not (Backward. is_empty_model backward))
222- || not (Sanitize. is_empty sanitize )
258+ || not (Sanitizers. is_empty_model sanitizers )
223259
224260
225261 let join ~iteration :_ left right =
226262 {
227263 forward = Forward. join left.forward right.forward;
228264 backward = Backward. join left.backward right.backward;
229- sanitize = Sanitize . join left.sanitize right.sanitize ;
265+ sanitizers = Sanitizers . join left.sanitizers right.sanitizers ;
230266 modes = ModeSet. join left.modes right.modes;
231267 }
232268
@@ -235,7 +271,7 @@ module ResultArgument = struct
235271 {
236272 forward = Forward. widen ~iteration ~previous: previous.forward ~next: next.forward;
237273 backward = Backward. widen ~iteration ~previous: previous.backward ~next: next.backward;
238- sanitize = Sanitize. join previous.sanitize next.sanitize ;
274+ sanitizers = Sanitizers. widen ~iteration ~ previous: previous.sanitizers ~ next: next.sanitizers ;
239275 modes = ModeSet. widen ~iteration ~prev: previous.modes ~next: next.modes;
240276 }
241277
@@ -246,7 +282,12 @@ module ResultArgument = struct
246282
247283
248284 let strip_for_callsite
249- { forward = { source_taint } ; backward = { sink_taint; taint_in_taint_out } ; sanitize; modes }
285+ {
286+ forward = { source_taint } ;
287+ backward = { sink_taint; taint_in_taint_out } ;
288+ sanitizers;
289+ modes;
290+ }
250291 =
251292 (* Remove positions and other info that are not needed at call site *)
252293 let source_taint =
@@ -279,13 +320,18 @@ module ResultArgument = struct
279320 Map
280321 ~f: Domains.TraceInfo. strip_for_callsite
281322 in
282- { forward = { source_taint }; backward = { sink_taint; taint_in_taint_out }; sanitize ; modes }
323+ { forward = { source_taint }; backward = { sink_taint; taint_in_taint_out }; sanitizers ; modes }
283324
284325
285326 let model_to_json
286327 ~filename_lookup
287328 callable
288- { forward = { source_taint } ; backward = { sink_taint; taint_in_taint_out } ; sanitize; modes }
329+ {
330+ forward = { source_taint } ;
331+ backward = { sink_taint; taint_in_taint_out } ;
332+ sanitizers = { global = global_sanitizer ; roots = root_sanitizers } ;
333+ modes;
334+ }
289335 =
290336 let callable_name = Interprocedural.Target. external_target_name callable in
291337 let model_json = [" callable" , `String callable_name] in
@@ -308,8 +354,14 @@ module ResultArgument = struct
308354 model_json
309355 in
310356 let model_json =
311- if not (Sanitize. is_empty sanitize) then
312- model_json @ [" sanitize" , Sanitize. to_json sanitize]
357+ if not (Sanitize. is_empty global_sanitizer) then
358+ model_json @ [" global_sanitizer" , Sanitize. to_json global_sanitizer]
359+ else
360+ model_json
361+ in
362+ let model_json =
363+ if not (SanitizeRootMap. is_bottom root_sanitizers) then
364+ model_json @ [" sanitizers" , SanitizeRootMap. to_json root_sanitizers]
313365 else
314366 model_json
315367 in
0 commit comments