Closed
Description
Hello,
We are looking to solicit some feedback from the Kani Team for the following proposal
on future integration between Kani and CBMC.
Do let us know about any inaccuracies in the description of the status quo, or any clarifications/enhancements to the proposals.
Thank you,
Current Integration between Kani and CBMC
Bulk of code of interest is under kani/kani-driver
. The following steps are traced from kani/kani-driver/src/main.rs
.
- Translate
.rs
file into*.symtab.json
cargo_build
inkani/kani-driver/src/call_cargo.rs
- Iterate through all the
*.symtab.json
files produced in step 1, and convert them (link all of the symbol table files) into*.symtab.out
by callingsymtab2gb
.- In
symbol_table_to_gotoc
atkani/kani-driver/src/call_symtab.rs
- The output at this level is (multiple?)
GOTO-binary
- In
- Link the binaries produced at step 2, into one
GOTO-binary
.- In
link_goto_binary
atkani/kani-driver/src/call_goto_cc.rs
. - The output at this level is a single
GOTO-binary
.
- In
- Perform instrumentation (with
goto-instrument
) run of file- But after a function has been set as the entry point - designated harness - by
goto-cc
- In
run_goto_instrument
atkani/kani-driver/src/call_goto_instrument.rs
- Perform
goto-model
validation, then perform series of instrumentations (drop unused functions, rewrite back edges, etc)
- But after a function has been set as the entry point - designated harness - by
- Kani runs
cbmc
on binary (harness) and collects report- At
check_harness
inkani/kani-driver/src/main.rs
check_harness
callscbmc
through call torun_cbmc
ofkani/kani-driver/src/call_cbmc.rs
- At
Considerations
- The Kani Team probably want something like a Rust <-> C++ bridge, kind of like
https://cxx.rs
, so we can assume that they can call into the C++ functions.- This works by building the C++ and Rust files, along with the bridge. Demo: https://github.com/dtolnay/cxx/tree/master/demo
- For a first draft API, we probably need to make these calls easier to enter into.
goto_convert
demands exposing the concepts of asymbol_tablet
,goto_modelt
, andmessage_handler
- Maybe not the
message_handler
, looks like an implementation detail that could be hidden. - The
goto-binary
is effectively a serialised version of thegoto_modelt
- Kani does have its own model of a CBMC symbol table at
kani/cprover_bindings/src/goto_program/symbol_table.rs
- Maybe not the
- In theory, linking with
goto-cc
could be done programmatically, but at the moment too stateful (depends on state ofcompilet
which depends on initial configuration done bygoto-gcc
personality). - However call to
goto-cc --function
might be able to be skipped if a call toansi-c-entry-point
can be made.- A bit hard, as for now it also depends on
configt
, but in theory nothing binds it to it - could be refactored?
- A bit hard, as for now it also depends on
- Effectively,
CBMC::do_it
is performing some initialisation that all leads to a selection of averifier
, which is amulti
orsingle-path-symex-checkert
, then initialised with some options and the goto-model, and instructed to run, and report on the run results.- The initialisation depends on a
goto-program
produced throughget_goto_program
, which in turn callsprocess_goto_program
, which performs a number of transformations on thegoto-program
, for instance removing inline assembly or skips, performing a reachability slice, etc. - Most of these transformations are also performed by
goto-instrument
, but there are some problems:- Non-uniform interface between these transformation passes.
- Non-delineated boundaries between these transformations/unknown invariants between these different transformation passes.
- The initialisation depends on a
- There are two options for linking. Either calling the
linkingt
class, likesymtab2gb
does, which operates on a symbol table level, or callinglink_goto_model
, which operates at the level of two goto-models.
Proposals
Long-term Goal
- Standardisation of most operations around a
goto-modelt
.cbmc
,goto-instrument
, etc., are going to be loading agoto-modelt
in memory.- All transformations, analysis, linking, etc. will be working on the
goto-modelt
.- Auxiliary functionality to translate a
symbol_tablet
into agoto-modelt
(throughgoto_convert
is also going to be exposed), to enable current producers ofsymbol_tablet
(that now depend onsymtab2gb
) to be able to easily convert into agoto-modelt
for further manipulation/transformations.
- Auxiliary functionality to translate a
- Subsequent transformations to the
goto-modelt
(say, for instance,remove_skips
) are going to be maintained as a versioned patch-set over the initial model.- This would allow rollbacks of transformations to be both possible and efficient in the future.
- This would also support scripting of the transformations and associated error handling without the need to start from scratch when a transformation has corrupted the goto-model.
- All tools standardise their interface around a
config
andgoto-modelt
.- This allows external tools to be able to invoke them with with a provided configuration and
goto-modelt
.
- This allows external tools to be able to invoke them with with a provided configuration and
- This will allow CPROVER tools, to transition into being a library around
goto-modelt
on a long term basis.- This would allow users to write their own transformations/tools over
goto-modelt
, both as parts of the CPROVER library, and as external tools.- The existing tools
cbmc
,goto-instrument
, etc, could then be repurposed to be thin CLI wrappers around the library.
- The existing tools
- External tools will be able to load
goto-modelt
in the library, and extract a new one (along with analysis/verification reports, traces, etc.) from the new library.
- This would allow users to write their own transformations/tools over
- The clean-up of interfaces and internals of these tools will also offer the extra benefit of increased reliability/robustness for these tools when they are being used/invoked in binary form.
Step 1: API for invoking verification with CBMC
- We will start moving towards the ideals expressed at the Long-term Goal above, by attempting to refactor
cbmc
(the binary) in a way that exposes a uniform verification interface.- Right now,
cbmc
's entry point is the functiondoit
, which for the most part does configuration management (by parsing command line arguments, etc) and loading/preprocessing of agoto-modelt
which it then passes on a verifier (selected based on command line arguments). - Aim is to expose these verifiers on a more uniform interface, and make sure that they can be invoked on a
goto-modelt
and aconfigt
passed to them, with no other dependencies.
- Right now,
- This allows us to deduplicate the main analysis engine from global state (which it now depends on, set up while the cbmc binary bootstraps) and make it easier to enter, both from within the CPROVER tools, and from external tools.
- At the end of this step, we will have exposed
cbmc
in a way that enables programmatic access of the verification engine, instead of depending on the call to a binary version of it.
Step 2: API extended with goto-model transformations
- As part of the first step, we will have characterised the schema of the
goto-modelt
required to be passed in to the verifiers.- This means that the minimum set of invariants required to analyse a
goto-modelt
are going to be enforced before any analysis.
- This means that the minimum set of invariants required to analyse a
- This allows us to work backwards from that base, and start isolating other transformations on the
goto-modelt
(for example, the ones provided bygoto-instrument
) while always preserving the sequence of invariants demanded by these transformations, and ultimately, the verification engine.- We can also iron out the rough edges on their interfaces (make them uniform - right now some operate on the level of
goto-functions
, others on the level ofgoto-modelt
, there are differences in the arities of these functions, etc).
- We can also iron out the rough edges on their interfaces (make them uniform - right now some operate on the level of
- At the end of this step, we will have similarly exposed
goto-instrument
in a way that enables performing the instrumentations that it provides in a programmatic way, without needing to depend on multiple calls to the binary.
Step 3: API extended with compilation and linking
- After we can get all transformations to work and tools to be centred around a
goto-modelt
, we can then move on adding construction ofgoto-modelt
s with compilation and linking supported by an API. - At the end of this step, we will have exposed the core functionality provided by
goto-cc
so that it can be manipulated programmatically.
Step 4: API to enable programmatic construction of goto-modelt
- At this step, we have all we need to handle compilation/linking/transformations of existing
goto-modelt
s, so the next step is to provide an API that allows staged construction of agoto-modelt
in a programmatic function.- The
goto-modelt
is effectively a symbol table and a CFG (in the form ofgoto-functionst
) - the API would offer the capability to create a newgoto-function
, addgoto-instructions
to its body, and update the symbol table with the symbols it contains.
- The
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
Done