Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor and generalize warning system to message system #338

Merged
merged 97 commits into from
Sep 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
b466336
Remove practically unused tracking (not tracing!)
sim642 Aug 25, 2021
27a3ea7
Remove unused Config.experimental
sim642 Aug 25, 2021
36063d2
Remove gccwarn option
sim642 Aug 25, 2021
f4035f6
Remove Messages.waitWhat and StopTheWorld
sim642 Aug 25, 2021
d41b6e5
Remove unused Messages.warn_urgent
sim642 Aug 25, 2021
219ef11
Remove unused Messages.soundness variable
sim642 Aug 25, 2021
dedea29
Remove confusing Messages.warnings variable and print warnings regard…
sim642 Aug 25, 2021
5e86bdb
Add warnings to warning_table regardless of options
sim642 Aug 25, 2021
6c44903
Add more general Message record, use for deduplication
sim642 Aug 25, 2021
5689bb4
Deduplicate message string construction
sim642 Aug 25, 2021
676ca5c
Add context to message as Obj.t
sim642 Aug 25, 2021
ac2667b
Add messages list to keep order
sim642 Aug 25, 2021
e72cba5
Remove warn_all usage outside Messages
sim642 Aug 25, 2021
57b0eb9
Move common code to warn_all
sim642 Aug 25, 2021
c788fac
Remove report_error
sim642 Aug 25, 2021
448be7b
Simplify Messages.debug
sim642 Aug 25, 2021
231d0bb
Remove loc argument on warn_all
sim642 Aug 25, 2021
f5ddc4c
Replace warn context argument with Messages.current_context
sim642 Aug 30, 2021
33aefa7
Deduplicate should_warn checks
sim642 Aug 30, 2021
8a95383
Add severity to messages
sim642 Aug 30, 2021
e858524
Replace must warnings with error severity messages
sim642 Aug 30, 2021
74f0c01
Consider Error as warning for regression testing
sim642 Aug 30, 2021
4679fdf
Remove warning certainty
sim642 Aug 30, 2021
b2de8d9
Remove Debug warning type which is now covered by Debug severity instead
sim642 Aug 30, 2021
757a7b9
Use Debug severity for Messages.debug
sim642 Aug 30, 2021
db214e5
Add should_warn to Message
sim642 Aug 30, 2021
3f1911e
Deduplicate Messages internal functions
sim642 Aug 30, 2021
e8cd360
Make warning message text mandatory
sim642 Aug 30, 2021
2d4ebcc
Remove unit argument from warning
sim642 Aug 30, 2021
7ee34ca
Inline some internal Messages functions
sim642 Aug 30, 2021
6f24f29
Generalize severity message functions further
sim642 Aug 30, 2021
db47673
Inline remaining internal Messages functions
sim642 Aug 30, 2021
97b2329
Rename Messages.warn_all -> add
sim642 Aug 30, 2021
2a62cce
Remove empty text case from Messages.Message.show
sim642 Aug 30, 2021
b3bca05
Remove unused printXmlGlobals which was a duplicate of printXmlWarning
sim642 Aug 30, 2021
054cb77
Add test where bailure is unsound
sim642 Aug 30, 2021
a8ba110
Remove unsound bailure
sim642 Aug 30, 2021
717b7c1
Replace strange library function failures with warnings
sim642 Aug 30, 2021
b42e902
Fix invalidation of pthread_create
sim642 Aug 30, 2021
f59035d
Extract piece from message
sim642 Aug 30, 2021
0ded1e8
Add support for group messages in new table
sim642 Aug 30, 2021
8e2be96
Reimplement Messages.print_group in new system
sim642 Aug 30, 2021
5b0a15c
Switch from warnings_table to messages_list
sim642 Aug 30, 2021
c38250d
Remove old warnings_table and print functions
sim642 Aug 30, 2021
35ce918
Rename Messages.print_group -> warn_group_old
sim642 Aug 30, 2021
e6573d2
Add message severity colors to terminal output
sim642 Aug 30, 2021
a9273b4
Add Success severity, use severities for assert coloring
sim642 Aug 30, 2021
623e02c
Remove unnecessary color from about to crash
sim642 Aug 30, 2021
1e1c51b
Add Assert type to messages
sim642 Aug 30, 2021
d37ed2e
Rename message warning type to category
sim642 Aug 31, 2021
eab6bbb
Move message category definitions to separate file
sim642 Aug 31, 2021
935e722
Remove unnecessary wrapper module in MessageCategory
sim642 Aug 31, 2021
52eb20b
Replace message category with list of tags
sim642 Aug 31, 2021
8c87f20
Add CWE tag for messages
sim642 Aug 31, 2021
0e55864
Add CWE tag to integer overflow
sim642 Aug 31, 2021
59fa71f
Add CWE tag to NULL pointer dereference
sim642 Aug 31, 2021
3c75f87
Use Format for printing messages
sim642 Aug 31, 2021
4ceddf4
Add terminal output colors to Format
sim642 Aug 31, 2021
48ea43e
Refactor message Format logic
sim642 Aug 31, 2021
c161068
Move Messages.colorize to MessageUtil
sim642 Aug 31, 2021
064cd0a
Move Format ANSI color tags to GobFormat
sim642 Aug 31, 2021
9944f21
Generalize ANSI color table in MessageUtil
sim642 Aug 31, 2021
3515e09
Use ANSI color table in GobFormat
sim642 Aug 31, 2021
9569736
Reformat GobFormat.pp_set_ansi_color_tags
sim642 Aug 31, 2021
5ee7ebb
Replace Messages.warn_out with formatter
sim642 Aug 31, 2021
5c973e5
Add pp to CilType.Location
sim642 Aug 31, 2021
fe0b251
Remove unused show functions in Messages
sim642 Aug 31, 2021
48bd28a
Derive to_yojson for messages
sim642 Aug 31, 2021
a5e149c
Add result output json-messages
sim642 Aug 31, 2021
9649d81
Override message to_yojson for better structure
sim642 Aug 31, 2021
befc351
Remove square brackets from message category JSON
sim642 Aug 31, 2021
91723d1
Replace message show functions with Format
sim642 Aug 31, 2021
1d37580
Wrap messages table in a module
sim642 Aug 31, 2021
477a320
Make json-messages output pretty
sim642 Aug 31, 2021
f943b87
Extract Messages.Table.to_yojson
sim642 Aug 31, 2021
1c6ae41
Fix json-messages output being reversed
sim642 Aug 31, 2021
f51cc40
Merge branch 'master' into messages-refactor
sim642 Aug 31, 2021
3daafee
Use BatList.concat_map instead of List.concat_map for OCaml 4.09
sim642 Sep 1, 2021
0e9fb77
Generalize non-each message functions to Pretty format
sim642 Sep 1, 2021
c04c7ae
Generalize each message functions to Pretty format
sim642 Sep 1, 2021
888ce39
Fix nested lists in warning documentation
sim642 Sep 1, 2021
36a94af
Update warning categories in documentation
sim642 Sep 1, 2021
b41b33d
Remove useless () arguments from message category convenience functions
sim642 Sep 1, 2021
0372f53
Add documentation for refactored message system
sim642 Sep 1, 2021
f9bec05
Remove outdated warning documentation
sim642 Sep 1, 2021
effdb8b
Move messaging up in documentation navigation
sim642 Sep 1, 2021
f1b40ab
Use List.concat instead of BatList.concat_map for OCaml 4.09
sim642 Sep 1, 2021
9e6dd95
Fix MessageUtil.colors_on always checking stdout
sim642 Sep 1, 2021
d0497eb
Use pretty instead of show for warnings in Deadlock
sim642 Sep 1, 2021
0260ea4
Remove useless unit statements in MessageCategory
sim642 Sep 1, 2021
b3e30c8
Remove non-each message functions
sim642 Sep 6, 2021
23302ef
Remove print_loc from message
sim642 Sep 6, 2021
452a0a3
Remove _each suffix from message functions
sim642 Sep 6, 2021
84a09d8
Add _noloc message functions for future use
sim642 Sep 6, 2021
4e7aecd
Add info severity message functions
sim642 Sep 6, 2021
8f0aaf2
Update messaging documentation about locations
sim642 Sep 6, 2021
268d651
Merge branch 'master' into messages-refactor
sim642 Sep 6, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions docs/developer-guide/messaging.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Messaging

The message system in `Messages` module should be used for outputting all (non-[tracing](./debugging.md#tracing)) information instead of printing them directly to `stdout`.
This allows for consistent pretty terminal output, as well as export to Goblint result viewers and IDEs.

## Message structure

A message consists of the following:

1. **Severity.** One of: error, warning, info, debug, success.
2. **Tags.** A list of tags (including multiple of the same kind):
* **Category.** One of possibly-nested variants defined in `MessageCategory` module.
* **CWE.** With a Common Weakness Enumeration number.
3. **Content.** One of the following:
* **Single.** Contains the following:
1. **Text.**
2. **Location.** Optional.
3. **Context.** Optional. Currently completely abstract, so not very useful.
* **Group.** For messages related to numerous locations with different texts. Contains the following:
1. **Group text.** An overall description of the group message.
2. **Pieces.** A list of single messages as described above.

## Creating

### OCaml

In OCaml code, messages can be created using convenience functions in `Messages`.
For example:
```ocaml
Messages.warn "Text";
Messages.debug "Text"; (* severity functions *)
Messages.warn "Text %s %d %a" "foo" 42 Cil.d_exp exp; (* Pretty format *)
Messages.warn ~category:Messages.Category.Integer.overflow "Text"; (* category *)
Messages.warn ~category:Messages.Category.Integer.overflow ~tags:[Messages.Tag.CWE 190] "Text"; (* extra tags *)
Messages.warn ~loc:otherloc "Text"; (* non-current location *)
Messages.warn_noloc "Text"; (* no location *)
```

The `~category` argument is optional and defaults to `Unknown`, but all newly added messages should have non-unknown category. New categories should be defined if necessary.

The `~tags` argument is optional and allows an arbitrary list of tags (including multiple different categories). The `~category` argument is simply for convenience to add one category tag.

The `~loc` argument is optional and defaults to the current location, but allows messages at a non-current location.

The `_noloc` suffixed functions allow general messages without any location (not even current).

By convention, may-warnings (the usual case) should use warning severity and must-warnings should use error severity.

### Spec analysis

Warnings inside `.spec` files are converted to warnings.
They parsed from string warnings: the first space-delimited substring determines the category and the rest determines the text.

For example:
```
w1 "behavior.undefined.use_after_free"
w2 "integer.overflow"
w3 "unknown my message"
w4 "integer.overflow some text describing the warning"
```
93 changes: 0 additions & 93 deletions docs/developer-guide/warning.md

This file was deleted.

2 changes: 1 addition & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ nav:
- user-guide/inspecting.md
- 'Developer guide':
- developer-guide/developing.md
- developer-guide/messaging.md
- developer-guide/testing.md
- developer-guide/debugging.md
- developer-guide/warning.md
- developer-guide/profiling.md
- developer-guide/documenting.md
- 'Artifact descriptions':
Expand Down
2 changes: 0 additions & 2 deletions scripts/set_version.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ fi
if [ ! -f src/config.ml ]; then
{
echo "let tracing = false"
echo "let tracking = false"
echo "let experimental = false"
echo "let cpp = \"cpp\""
} >> src/config.ml
fi
Expand Down
6 changes: 0 additions & 6 deletions scripts/track_off.sh

This file was deleted.

6 changes: 0 additions & 6 deletions scripts/track_on.sh

This file was deleted.

1 change: 1 addition & 0 deletions scripts/update_suite.rb
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,7 @@ def to_s
when /Assertion .* will succeed/ then "success"
when /Assertion .* is unknown/ then "unknown"
when /^\[Warning\]/ then "warn"
when /^\[Error\]/ then "warn"
when /\[Debug\]/ then next # debug "warnings" shouldn't count as other warnings (against NOWARN)
else "other"
end
Expand Down
43 changes: 21 additions & 22 deletions src/analyses/arinc.ml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ open Analyses

module BI = IntOps.BigIntOps

let debug_doc doc = M.debug_each (Pretty.sprint 99 doc)
let debug_doc doc = M.debug "%a" Pretty.insert doc

module Functions = struct
let prefix = "LAP_Se_"
Expand Down Expand Up @@ -146,26 +146,26 @@ struct
let dummy_global_dlval = { dummyFunDec.svar with vname = "Gret" }, `NoOffset
let global_dlval dlval fname =
if Lval.CilLval.class_tag dlval = `Global then (
M.debug_each @@ "WARN: " ^ fname ^ ": use of global lval: " ^ str_return_dlval dlval;
M.debug "WARN: %s: use of global lval: %s" fname (str_return_dlval dlval);
if GobConfig.get_bool "ana.arinc.merge_globals" then dummy_global_dlval else dlval
) else dlval
let mayPointTo ctx exp =
match ctx.ask (Queries.MayPointTo exp) with
| a when not (Queries.LS.is_top a) && Queries.LS.cardinal a > 0 ->
let top_elt = (dummyFunDec.svar, `NoOffset) in
let a' = if Queries.LS.mem top_elt a then (
M.debug_each @@ "mayPointTo: query result for " ^ sprint d_exp exp ^ " contains TOP!"; (* UNSOUND *)
M.debug "mayPointTo: query result for %a contains TOP!" d_exp exp; (* UNSOUND *)
Queries.LS.remove top_elt a
) else a
in
Queries.LS.elements a'
| v ->
M.debug_each @@ "mayPointTo: query result for " ^ sprint d_exp exp ^ " is " ^ sprint Queries.LS.pretty v;
M.debug "mayPointTo: query result for %a is %a" d_exp exp Queries.LS.pretty v;
(*failwith "mayPointTo"*)
[]
let mustPointTo ctx exp = let xs = mayPointTo ctx exp in if List.length xs = 1 then Some (List.hd xs) else None
let iterMayPointTo ctx exp f = mayPointTo ctx exp |> List.iter f
let debugMayPointTo ctx exp = M.debug_each @@ sprint d_exp exp ^ " mayPointTo " ^ (String.concat ", " (List.map (sprint Lval.CilLval.pretty) (mayPointTo ctx exp)))
let debugMayPointTo ctx exp = M.debug "%a mayPointTo %a" d_exp exp (Pretty.d_list ", " Lval.CilLval.pretty) (mayPointTo ctx exp)


(* transfer functions *)
Expand All @@ -181,13 +181,13 @@ struct
(* OPT: this matching is just for speed up to avoid querying on every assign *)
match lval with Var _, _ when not @@ is_return_code_type (Lval lval) -> ctx.local | _ ->
(* TODO why is it that current_node can be None here, but not in other transfer functions? *)
if not @@ Option.is_some !MyCFG.current_node then (M.debug_each "assign: MyCFG.current_node not set :("; ctx.local) else
if not @@ Option.is_some !MyCFG.current_node then (M.debug "assign: MyCFG.current_node not set :("; ctx.local) else
if D.is_bot1 ctx.local then ctx.local else
let env = get_env ctx in
let edges_added = ref false in
let f dlval =
(* M.debug_each @@ "assign: MayPointTo " ^ sprint d_plainlval lval ^ ": " ^ sprint d_plainexp (Lval.CilLval.to_exp dlval); *)
let is_ret_type = try is_return_code_type @@ Lval.CilLval.to_exp dlval with Cilfacade.TypeOfError Index_NonArray -> M.debug_each @@ "assign: Cilfacade.typeOf "^ sprint d_exp (Lval.CilLval.to_exp dlval) ^" threw exception Errormsg.Error \"Bug: typeOffset: Index on a non-array\". Will assume this is a return type to remain sound."; true in
(* M.debug @@ "assign: MayPointTo " ^ sprint d_plainlval lval ^ ": " ^ sprint d_plainexp (Lval.CilLval.to_exp dlval); *)
let is_ret_type = try is_return_code_type @@ Lval.CilLval.to_exp dlval with Cilfacade.TypeOfError Index_NonArray -> M.debug "assign: Cilfacade.typeOf %a threw exception Errormsg.Error \"Bug: typeOffset: Index on a non-array\". Will assume this is a return type to remain sound." d_exp (Lval.CilLval.to_exp dlval); true in
if (not is_ret_type) || Lval.CilLval.has_index dlval then () else
let dlval = global_dlval dlval "assign" in
edges_added := true;
Expand Down Expand Up @@ -225,7 +225,7 @@ struct
let else_node = NodeTbl.get @@ Branch (List.hd else_stmts) in
let dst_node = if tv then then_node else else_node in
let d_if = if List.length stmt.preds > 1 then ( (* seems like this never happens *)
M.debug_each @@ "WARN: branch: If has more than 1 predecessor, will insert Nop edges!";
M.debug "WARN: branch: If has more than 1 predecessor, will insert Nop edges!";
add_edges env ArincUtil.Nop;
{ ctx.local with pred = Pred.of_node env.node }
) else ctx.local
Expand Down Expand Up @@ -253,11 +253,11 @@ struct
| _ -> ctx.local

let checkPredBot d tf f xs =
if d.pred = Pred.bot () then M.debug_each @@ tf^": mapping is BOT!!! function: "^f.vname^". "^(String.concat "\n" @@ List.map (fun (n,d) -> n ^ " = " ^ Pretty.sprint 200 (Pred.pretty () d.pred)) xs);
if d.pred = Pred.bot () then M.debug "%s: mapping is BOT!!! function: %s. %a" tf f.vname (Pretty.d_list "\n" (fun () (n, d) -> Pretty.dprintf "%s = %a" n Pred.pretty d.pred)) xs;
d

let body ctx (f:fundec) : D.t = (* enter is not called for spawned processes -> initialize them here *)
(* M.debug_each @@ "BODY " ^ f.svar.vname ^" @ "^ string_of_int (!Tracing.current_loc).line; *)
(* M.debug @@ "BODY " ^ f.svar.vname ^" @ "^ string_of_int (!Tracing.current_loc).line; *)
(* if not (is_single ctx || !Goblintutil.global_initialization || fst (ctx.global part_mode_var)) then raise Analyses.Deadcode; *)
(* checkPredBot ctx.local "body" f.svar [] *)
let module BaseMain = (val Base.get_main ()) in
Expand All @@ -269,7 +269,7 @@ struct
ctx.local

let enter ctx (lval: lval option) (f:fundec) (args:exp list) : (D.t * D.t) list = (* on function calls (also for main); not called for spawned processes *)
(* print_endline @@ "ENTER " ^ f.vname ^" @ "^ string_of_int (!Tracing.current_loc).line; (* somehow M.debug_each doesn't print anything here *) *)
(* print_endline @@ "ENTER " ^ f.vname ^" @ "^ string_of_int (!Tracing.current_loc).line; (* somehow M.debug doesn't print anything here *) *)
let d_caller = ctx.local in
let d_callee = if D.is_bot ctx.local then ctx.local else { ctx.local with pred = Pred.of_node (MyCFG.Function f); ctx = Ctx.top () } in (* set predecessor set to start node of function *)
[d_caller, d_callee]
Expand Down Expand Up @@ -327,9 +327,8 @@ struct
let is_arinc_fun = startsWith Functions.prefix f.vname in
let is_creating_fun = startsWith (Functions.prefix^"Create") f.vname in
if M.tracing && is_arinc_fun then (
let args_str = String.concat ", " (List.map (sprint d_exp) arglist) in
(* M.tracel "arinc" "found %s(%s)\n" f.vname args_str *)
M.debug_each @@ "found "^f.vname^"("^args_str^") in "^env.fundec.svar.vname
M.debug "found %s(%a) in %s" f.vname (Pretty.d_list ", " d_exp) arglist env.fundec.svar.vname
);
let is_error_handler = env.pname = pname_ErrorHandler in
let eval_int exp =
Expand Down Expand Up @@ -367,7 +366,7 @@ struct
let f dlval =
let dlval = global_dlval dlval "special" in
if not @@ is_return_code_type @@ Lval.CilLval.to_exp dlval
then (M.debug_each @@ "WARN: last argument in arinc function may point to something other than a return code: " ^ str_return_dlval dlval; None)
then (M.debug "WARN: last argument in arinc function may point to something other than a return code: %s" (str_return_dlval dlval); None)
else (add_return_dlval env `Write dlval; Some (str_return_dlval dlval))
in
(* add actions for all lvals r may point to *)
Expand Down Expand Up @@ -421,7 +420,7 @@ struct
(* | "F62", [dst; src; len] (* strncmp *) *)
(* | "F63", [dst; src; len] (* memcpy *) *)
->
M.debug_each @@ "strcpy/"^f.vname^"("^sprint d_plainexp dst^", "^sprint d_plainexp src^")";
M.debug @@ "strcpy/"^f.vname^"("^sprint d_plainexp dst^", "^sprint d_plainexp src^")";
(*debugMayPointTo ctx dst;*)
assert_ptr dst; assert_ptr src;
(* let dst_lval = mkMem ~addr:dst ~off:NoOffset in *)
Expand All @@ -430,12 +429,12 @@ struct
| ls ->
ignore @@ Pretty.printf "strcpy %a points to %a\n" d_exp dst Queries.LS.pretty ls;
Queries.LS.iter (fun (v,o) -> ctx.assign ~name:"base" (Var v, Lval.CilLval.to_ciloffs o) src) ls
| _ -> M.debug_each @@ "strcpy/"^f.vname^"("^sprint d_plainexp dst^", "^sprint d_plainexp src^"): dst may point to anything!";
| _ -> M.debug @@ "strcpy/"^f.vname^"("^sprint d_plainexp dst^", "^sprint d_plainexp src^"): dst may point to anything!";
end;
d
| "F63" , [dst; src; len] (* memcpy *)
->
M.debug_each @@ "memcpy/"^f.vname^"("^sprint d_plainexp dst^", "^sprint d_plainexp src^")";
M.debug @@ "memcpy/"^f.vname^"("^sprint d_plainexp dst^", "^sprint d_plainexp src^")";
(match ctx.ask (Queries.EvalInt len) with
| `Int i ->
(*
Expand All @@ -450,11 +449,11 @@ struct
let dst_lval = mkMem ~addr:dst ~off:NoOffset in
let src_lval = mkMem ~addr:src ~off:NoOffset in
ctx.assign ~name:"base" dst_lval (Lval src_lval); (* this is only ok because we use ArrayDomain.Trivial per default, i.e., there's no difference between the first element or the whole array *)
| v -> M.debug_each @@ "F63/memcpy: don't know length: " ^ sprint Queries.Result.pretty v;
| v -> M.debug @@ "F63/memcpy: don't know length: " ^ sprint Queries.Result.pretty v;
let lval = mkMem ~addr:dst ~off:NoOffset in
ctx.assign ~name:"base" lval MyCFG.unknown_exp
);
M.debug_each @@ "done with memcpy/"^f.vname;
M.debug @@ "done with memcpy/"^f.vname;
d
| "F1" , [dst; data; len] (* memset: write char to dst len times *)
->
Expand All @@ -469,7 +468,7 @@ struct
*)
let dst_lval = mkMem ~addr:dst ~off:NoOffset in
ctx.assign ~name:"base" dst_lval data; (* this is only ok because we use ArrayDomain.Trivial per default, i.e., there's no difference between the first element or the whole array *)
| v -> M.debug_each @@ "F1/memset: don't know length: " ^ sprint Queries.Result.pretty v;
| v -> M.debug @@ "F1/memset: don't know length: " ^ sprint Queries.Result.pretty v;
let lval = mkMem ~addr:dst ~off:NoOffset in
ctx.assign ~name:"base" lval MyCFG.unknown_exp
);
Expand Down Expand Up @@ -513,7 +512,7 @@ struct
let pid' = Process, name in
assign_id pid (get_id pid');
add_actions (List.map (fun f -> CreateProcess Action.({ pid = pid'; f; pri; per; cap })) funs)
| _ -> let f (type a) (x: a Queries.result) = "TODO" in struct_fail M.debug_each (`Result (f name, f entry_point, f pri, f per, f cap)); d (* TODO: f*)
| _ -> let f (type a) (x: a Queries.result) = "TODO" in struct_fail (M.debug "%s") (`Result (f name, f entry_point, f pri, f per, f cap)); d (* TODO: f*)
end
| "LAP_Se_GetProcessId", [name; pid; r] ->
assign_id_by_name Process name pid; d
Expand Down
Loading