Re-arrangement and extension of structures with fresh variables

`exception` `ARRAY_ACCESS`
`val is_only_pt_by_fld_or_param_nonnull : InferIR.Procdesc.t ‑> InferIR.Tenv.t ‑> Prop.normal Prop.t ‑> InferIR.Exp.t ‑> bool`
`val check_dereference_error : InferIR.Tenv.t ‑> InferIR.Procdesc.t ‑> Prop.normal Prop.t ‑> InferIR.Exp.t ‑> InferBase.Location.t ‑> unit`

Check for dereference errors: dereferencing 0, a freed value, or an undefined value

`val check_call_to_objc_block_error : InferIR.Tenv.t ‑> InferIR.Procdesc.t ‑> Prop.normal Prop.t ‑> InferIR.Exp.t ‑> InferBase.Location.t ‑> unit`

Check that an expression representing an objc block can be null and raise a `B1` null exception. It's used to check that we don't call possibly null blocks

`val rearrange : ?⁠report_deref_errors:bool ‑> InferIR.Procdesc.t ‑> InferIR.Tenv.t ‑> InferIR.Exp.t ‑> InferIR.Typ.t ‑> Prop.normal Prop.t ‑> InferBase.Location.t ‑> InferIR.Sil.offset list Prop.prop_iter list`

`rearrange lexp prop` rearranges `prop` into the form `prop' * lexp|->strexp:typ`. It returns an iterator with `lexp |-> strexp: typ` as current predicate and the path (an `offsetlist`) which leads to `lexp` as the iterator state.