[starvation] fix static field printing

Summary:
The Java frontend translates java field accesses on an object reference as field (`.`) followed by dereference (`*`) exactly like the arrow operator in C.  However, when the field is static, it generates just a field access `.`.  This is a bug.

This diff mitigates its effects for printing locks in starvation.

Reviewed By: skcho

Differential Revision: D21882875

fbshipit-source-id: 79846d826
master
Nikos Gorogiannis 5 years ago committed by Facebook GitHub Bot
parent 1635c1cf96
commit 428c18e619

@ -60,14 +60,18 @@ let pp_with_base pp_base fmt (base, accesses) =
| FieldAccess field_name :: Dereference :: rest, _ ->
let op = match !Language.curr_language with Clang -> "->" | Java -> "." in
F.fprintf fmt "%a%s%a" pp_rev_accesses rest op Fieldname.pp field_name
| FieldAccess field_name :: rest, Clang ->
| FieldAccess field_name :: rest, _ ->
(* Java is allowed here only because the frontend is broken and generates
[FieldAccess] without a [Dereference] for static fields *)
F.fprintf fmt "%a.%a" pp_rev_accesses rest Fieldname.pp field_name
| Dereference :: rest, Clang ->
F.fprintf fmt "*(%a)" pp_rev_accesses rest
| TakeAddress :: rest, Clang ->
F.fprintf fmt "&(%a)" pp_rev_accesses rest
| access :: rest, Java ->
L.internal_error "Asked to print %a in Java mode@" (HilExp.Access.pp (fun _ _ -> ())) access ;
L.internal_error "Asked to print %a in Java mode@\n"
(HilExp.Access.pp (fun _ _ -> ()))
access ;
pp_rev_accesses fmt rest
in
pp_rev_accesses fmt (List.rev accesses)

Loading…
Cancel
Save