|
|
@ -57,7 +57,8 @@ let immediate_or_first_call calling_context (trace : Trace.t) =
|
|
|
|
let get_message diagnostic =
|
|
|
|
let get_message diagnostic =
|
|
|
|
let pulse_start_msg = "Pulse found a potential" in
|
|
|
|
let pulse_start_msg = "Pulse found a potential" in
|
|
|
|
match diagnostic with
|
|
|
|
match diagnostic with
|
|
|
|
| AccessToInvalidAddress {calling_context; invalidation; invalidation_trace; access_trace} -> (
|
|
|
|
| AccessToInvalidAddress
|
|
|
|
|
|
|
|
{calling_context; invalidation; invalidation_trace; access_trace; must_be_valid_reason} -> (
|
|
|
|
let invalidation, invalidation_trace =
|
|
|
|
let invalidation, invalidation_trace =
|
|
|
|
Trace.get_invalidation access_trace
|
|
|
|
Trace.get_invalidation access_trace
|
|
|
|
|> Option.value_map
|
|
|
|
|> Option.value_map
|
|
|
@ -67,6 +68,14 @@ let get_message diagnostic =
|
|
|
|
match invalidation with
|
|
|
|
match invalidation with
|
|
|
|
| ConstantDereference i when IntLit.equal i IntLit.zero ->
|
|
|
|
| ConstantDereference i when IntLit.equal i IntLit.zero ->
|
|
|
|
(* Special error message for nullptr dereference *)
|
|
|
|
(* Special error message for nullptr dereference *)
|
|
|
|
|
|
|
|
let issue_kind_str =
|
|
|
|
|
|
|
|
match must_be_valid_reason with
|
|
|
|
|
|
|
|
| Some (Invalidation.SelfOfNonPODReturnMethod non_pod_typ) ->
|
|
|
|
|
|
|
|
F.asprintf "undefined behaviour caused by nil messaging of non-pod return type (%a)"
|
|
|
|
|
|
|
|
(Typ.pp Pp.text) non_pod_typ
|
|
|
|
|
|
|
|
| _ ->
|
|
|
|
|
|
|
|
F.sprintf "null pointer dereference"
|
|
|
|
|
|
|
|
in
|
|
|
|
let pp_access_trace fmt (trace : Trace.t) =
|
|
|
|
let pp_access_trace fmt (trace : Trace.t) =
|
|
|
|
match immediate_or_first_call calling_context trace with
|
|
|
|
match immediate_or_first_call calling_context trace with
|
|
|
|
| `Immediate ->
|
|
|
|
| `Immediate ->
|
|
|
@ -78,10 +87,10 @@ let get_message diagnostic =
|
|
|
|
let pp_line fmt line = F.fprintf fmt "on line %d" line in
|
|
|
|
let pp_line fmt line = F.fprintf fmt "on line %d" line in
|
|
|
|
match immediate_or_first_call calling_context trace with
|
|
|
|
match immediate_or_first_call calling_context trace with
|
|
|
|
| `Immediate ->
|
|
|
|
| `Immediate ->
|
|
|
|
F.fprintf fmt "null pointer dereference %a" pp_line line
|
|
|
|
F.fprintf fmt "%s %a" issue_kind_str pp_line line
|
|
|
|
| `Call f ->
|
|
|
|
| `Call f ->
|
|
|
|
F.fprintf fmt "null pointer dereference %a indirectly during the call to %a" pp_line
|
|
|
|
F.fprintf fmt "%s %a indirectly during the call to %a" issue_kind_str pp_line line
|
|
|
|
line CallEvent.describe f
|
|
|
|
CallEvent.describe f
|
|
|
|
in
|
|
|
|
in
|
|
|
|
let invalidation_line =
|
|
|
|
let invalidation_line =
|
|
|
|
let {Location.line; _} = Trace.get_outer_location invalidation_trace in
|
|
|
|
let {Location.line; _} = Trace.get_outer_location invalidation_trace in
|
|
|
|