You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.8 KiB

(*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* 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 PulseBasicInterface
module AbductiveDomain = PulseAbductiveDomain
type 'astate error =
| PotentialInvalidAccess of {astate: 'astate; address: AbstractValue.t; must_be_valid: Trace.t}
| PotentialInvalidAccessSummary of
{astate: AbductiveDomain.summary; address: AbstractValue.t; must_be_valid: Trace.t}
| ReportableError of {astate: 'astate; diagnostic: Diagnostic.t}
| ISLError of 'astate
type ('a, 'astate) base_t = ('a, 'astate error) result
type 'a t = ('a, AbductiveDomain.t) base_t
type 'astate abductive_error =
[ `ISLError of 'astate
| `PotentialInvalidAccess of 'astate * AbstractValue.t * Trace.t
| `PotentialInvalidAccessSummary of AbductiveDomain.summary * AbstractValue.t * Trace.t ]
let of_abductive_error = function
| `ISLError astate ->
ISLError astate
| `PotentialInvalidAccess (astate, address, must_be_valid) ->
PotentialInvalidAccess {astate; address; must_be_valid}
| `PotentialInvalidAccessSummary (astate, address, must_be_valid) ->
PotentialInvalidAccessSummary {astate; address; must_be_valid}
let of_abductive_result abductive_result = Result.map_error abductive_result ~f:of_abductive_error
let of_abductive_access_result access_trace abductive_result =
Result.map_error abductive_result ~f:(function
| `InvalidAccess (invalidation, invalidation_trace, astate) ->
ReportableError
{ astate
; diagnostic=
AccessToInvalidAddress
{calling_context= []; invalidation; invalidation_trace; access_trace} }
| (`ISLError _ | `PotentialInvalidAccess _ | `PotentialInvalidAccessSummary _) as error ->
of_abductive_error error )