Skip to content

Parse log file of multi-threaded Kani run (terse output) into JSON #324

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

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

tautschnig
Copy link
Member

@tautschnig tautschnig commented Apr 14, 2025

Given a run of Kani on the standard library with --jobs=<N> --output-format=terse (and, typically, autoharness) enabled this produces a machine-processable JSON result via

python3 log_parser.py \
  --kani-list-file kani-list.json \
  --analysis-results-dir std_lib_analysis/results/ \
  verification.log -o results.json

where each entry in the resulting JSON array is of the form

{
  "thread_id": int,
  "result": {
    "harness": string,
    "is_autoharness": bool,
    "autoharness_result": string,
    "with_contract": bool,
    "crate": string,
    "function": string,
    "function_safeness": string,
    "file_name": string,
    "n_failed_properties": int,
    "n_total_properties": int,
    "result": string,
    "time": string,
    "output": array
  }
}

With the help of jq one can then conveniently compute various metrics, e.g.,

jq 'map(select(.result.result == "SUCCESSFUL" and
               .result.is_autoharness == true and
               .result.crate == "core" and
               .result.function_safeness == "unsafe" and
               .result.with_contract == true)) | length' results.json

to find the number of successfully-verified contracts of unsafe functions in crate core that were verified using automatically generated harnesses.

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 and MIT licenses.

Given a run of Kani on the standard library with `--verbose` (and,
typically, `autoharness`) enabled this produces a machine-processable
JSON result via
```
python3 log_parser.py \
  --kani-list-file kani-list.json \
  --analysis-results-dir std_lib_analysis/results/ \
  verification.log -o results.json
```
where each entry in the resulting JSON array is of the form
```
{
  "thread_id": int,
  "result": {
    "harness": string,
    "is_autoharness": bool,
    "autoharness_result": string,
    "with_contract": bool,
    "crate": string,
    "function": string,
    "function_safeness": string,
    "file_name": string,
    "n_failed_properties": int,
    "n_total_properties": int,
    "result": string,
    "time": string,
    "output": array
  }
}
```
With the help of `jq` one can then conveniently compute various metrics,
e.g.,
```
jq 'map(select(.result.result == "SUCCESSFUL" and
               .result.is_autoharness == true and
               .result.crate == "core" and
               .result.function_safeness == "unsafe" and
               .result.with_contract == true)) | length' results.json
```
to find the number of successfully-verified contracts of unsafe
functions in crate `core` that were verified using automatically
generated harnesses.
@tautschnig tautschnig requested a review from a team as a code owner April 14, 2025 11:12
Copy link

@carolynzech carolynzech left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Michael! It looks like these results will be very useful. My comments can be summarized as:

  1. asking for a bit more inline documentation, especially where we're doing some hardcoding to get around edge cases, and
  2. whether we should try to avoid duplicate dictionary keys

@tautschnig tautschnig changed the title Turn verbose Kani run into JSON Turn multi-threaded Kani run (terse output) into JSON Apr 24, 2025
@tautschnig tautschnig changed the title Turn multi-threaded Kani run (terse output) into JSON Parse log file of multi-threaded Kani run (terse output) into JSON Apr 24, 2025
@carolynzech carolynzech removed their assignment Apr 24, 2025
@tautschnig tautschnig assigned qinheping and unassigned tautschnig Apr 24, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants