-
Notifications
You must be signed in to change notification settings - Fork 284
Closed
Labels
KaniBugs or features of importance to Kani Rust VerifierBugs or features of importance to Kani Rust VerifierRFCRequest for commentRequest for commentawsBugs or features of importance to AWS CBMC usersBugs or features of importance to AWS CBMC usersaws-high
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
.rsfile into*.symtab.jsoncargo_buildinkani/kani-driver/src/call_cargo.rs
- Iterate through all the
*.symtab.jsonfiles produced in step 1, and convert them (link all of the symbol table files) into*.symtab.outby callingsymtab2gb.- In
symbol_table_to_gotocatkani/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_binaryatkani/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_instrumentatkani/kani-driver/src/call_goto_instrument.rs - Perform
goto-modelvalidation, 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
cbmcon binary (harness) and collects report- At
check_harnessinkani/kani-driver/src/main.rs check_harnesscallscbmcthrough call torun_cbmcofkani/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_convertdemands 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-binaryis 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-cccould be done programmatically, but at the moment too stateful (depends on state ofcompiletwhich depends on initial configuration done bygoto-gccpersonality). - However call to
goto-cc --functionmight be able to be skipped if a call toansi-c-entry-pointcan 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_itis performing some initialisation that all leads to a selection of averifier, which is amultiorsingle-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-programproduced 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
linkingtclass, likesymtab2gbdoes, 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-modeltin memory.- All transformations, analysis, linking, etc. will be working on the
goto-modelt.- Auxiliary functionality to translate a
symbol_tabletinto agoto-modelt(throughgoto_convertis also going to be exposed), to enable current producers ofsymbol_tablet(that now depend onsymtab2gb) to be able to easily convert into agoto-modeltfor 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
configandgoto-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-modelton 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-modeltin 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-modeltwhich 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-modeltand aconfigtpassed 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
cbmcin 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-modeltrequired to be passed in to the verifiers.- This means that the minimum set of invariants required to analyse a
goto-modeltare 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-instrumentin 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-modelts with compilation and linking supported by an API. - At the end of this step, we will have exposed the core functionality provided by
goto-ccso 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-modelts, so the next step is to provide an API that allows staged construction of agoto-modeltin a programmatic function.- The
goto-modeltis effectively a symbol table and a CFG (in the form ofgoto-functionst) - the API would offer the capability to create a newgoto-function, addgoto-instructionsto its body, and update the symbol table with the symbols it contains.
- The
Metadata
Metadata
Assignees
Labels
KaniBugs or features of importance to Kani Rust VerifierBugs or features of importance to Kani Rust VerifierRFCRequest for commentRequest for commentawsBugs or features of importance to AWS CBMC usersBugs or features of importance to AWS CBMC usersaws-high
Type
Projects
Status
Done