boogie(1)

๐Ÿ“ฆ version 2.4.1, in debian bookworm, ubuntu jammy, ubuntu noble

okay bestie, welcome to boogie(1) โ€” the manual for the Boogie compiler. ๐Ÿ’–

๐ŸŒธ NAME ๐ŸŒธ

boogie โ€” compiler for the Boogie programming language. periodt.

โœจ SYNOPSIS โœจ

boogie [options] file.bpl ...

๐Ÿฆ‹ DESCRIPTION ๐Ÿฆ‹

okay so boogie is a compiler for Microsoft Research's Boogie programming language, which is literally an imperative compiler intermediate language with built-in specification constructs. The integrated static analyzer can verify functional correctness as part of the compilation process. no cap. ๐Ÿ’…

๐Ÿ’… OPTIONS ๐Ÿ’…

boogie accepts a number of different types of options. iykyk.

๐ŸŽ€ File macros ๐ŸŽ€

A number of boogie options accept a file argument, which may contain the following macros:

  • @FILE@ โ€” expands to the last filename specified on the command line.
  • @PREFIX@ โ€” expands to the concatenation of strings given by /logPrefix options.
  • @TIME@ โ€” expands to the current time.

โœจ General options โœจ

  • /env:n โ€” controls printing of command-line arguments. Accepted values for n are:
    • 0 โ€” suppress printing of command-line arguments.
    • 1 โ€” (default) print command-line arguments during BPL print and prover log.
    • 2 โ€” print command-line arguments during BPL print and prover log, and also to standard output.
  • /noLogo โ€” suppress printing of the version number and copyright message.
  • /wait โ€” wait for a carriage return from the keyboard before exiting.
  • /xml:file โ€” also produce output in XML format to file.

๐Ÿฆ‹ Boogie options ๐Ÿฆ‹

Multiple .bpl files supplied on the command line are concatenated into one Boogie program. so if you pass a bunch, they become one vibe. ๐Ÿ’–

  • /enhancedErrorMessages:n โ€” control printing of enhanced error messages. Accepted values for n are:
    • 0 โ€” (default) do not print enhanced error messages.
    • 1 โ€” print Z3 error model enhanced error messages.
  • /loopUnroll:n โ€” unroll loops, following up to n back edges (and then some).
  • /mv:file โ€” save the model in BVD format to the specified file.
  • /noResolve โ€” parse only.
  • /noTypecheck โ€” parse and resolve only.
  • /overlookTypeErrors โ€” skip any implementation with resolution or type checking errors.
  • /print:file โ€” print Boogie program to the specified file after parsing it. Specify /print:- to print to standard output.
  • /printCFG:prefix โ€” print the control flow graph of each implementation in dot(1) format to files named prefix.procedurename.dot.
  • /printDesugared โ€” with /print, desugar calls.
  • /printModel:n โ€” control printing of Z3's error model. Accepted values for n are:
    • 0 โ€” (default) do not print Z3's error model.
    • 1 โ€” print Z3's error model.
    • 2 โ€” print Z3's error model and reverse mappings.
    • 3 โ€” print Z3's error model in a more human-readable way.
  • /printModelToFile:file โ€” with /print, print Z3's error model to file instead of standard output.
  • /printUnstructured โ€” with /print, desugar all structured statements.
  • /printWithUniqueIds โ€” print augmented information that uniquely identifies variables.
  • /proc:p โ€” only check procedures matched by the pattern p. This option may be specified multiple times to match multiple patterns. The pattern p matches the whole procedure name (e.g., a pattern "foo" will only match a procedure called "foo", not one called "fooBar"). The pattern p may contain * wildcards which match any character zero or more times. For example, the pattern "ab*d" would match "abd", "abcd", and "abccd", but not "Aabd" or "abdD". The pattern "*ab*d*" would match "abd", "abcd", "abccd", "Abd", and "abdD".
  • /soundLoopUnrolling โ€” enable sound loop unrolling.
  • /useBaseNameForFileName โ€” when parsing, use the base name of the file for tokens instead of the path supplied on the command line.

๐Ÿ”ฎ Inference options ๐Ÿ”ฎ

  • /checkInfer โ€” instrument inferred invariants as asserts to be checked by the theorem prover.
  • /contractInfer โ€” perform procedure contract inference.
  • /infer[:domains] โ€” use abstract interpretation to infer invariants. domains may be any of the following:
    • c โ€” constant propagation
    • d โ€” dynamic type
    • i โ€” intervals
    • j โ€” stronger intervals (cannot be combined with other domains)
    • n โ€” nullness
    • p โ€” polyhedra for linear inequalities
    • t โ€” trivial bottom/top lattice (cannot be combined with other domains)

You may also specify the following options as pseudo-domains:

  • s โ€” debug statistics
  • 0...9 โ€” number of iterations before applying a widen (default: 0)

The default is /infer:i. With /infer (and no domains), all domains will be used.

  • /instrumentInfer:flag โ€” control when inferred invariants are instrumented. Accepted values for flag are:
    • h โ€” (default) instrument inferred invariants only at the beginning of loop headers.
    • e โ€” instrument inferred invariants at the beginning and end of every block. This mode is intended for use in debugging abstract domains.
  • /noinfer โ€” turn off the default inference, and override any previous /infer flags.
  • /printInstrumented โ€” print Boogie program after it has been instrumented with invariants.

๐Ÿ› Debugging and tracing options ๐Ÿ›

  • /break โ€” launch and break into the debugger.
  • /log[:method] โ€” print debug output during translation.
  • /trace โ€” blurt out various debug trace information. Implies /tracePOs.
  • /tracePOs โ€” output information about the number of proof obligations.
  • /traceTimes โ€” output timing information at certain points in the pipeline.

๐Ÿ”ฅ Verification condition generation options ๐Ÿ”ฅ

  • /alwaysAssumeFreeLoopInvariants โ€” include free loop invariants as assumptions in checking contexts. Usually, a free loop invariant (or assume statement in that position) is ignored in checking contexts (like other free things).
  • /causalImplies โ€” translate Boogie's A ==> B into prover's A ==> A && B.
  • /coalesceBlocks:n โ€” control when to coalesce blocks. Accepted values for n are:
    • 0 โ€” do not coalesce blocks.
    • 1 โ€” (default) coalesce blocks.
  • /fixedPointEngine:engine โ€” use the specified fixed point engine for inference.
  • /inferLeastForUnsat:prefix โ€” infer the least number of constants (whose names are prefixed by prefix) that need to be set to true for the program to be correct. Implies /stratifiedInline:1.
  • /inline:strategy โ€” use the specified inlining strategy for procedures with the :inline attribute. Accepted strategies are none, assume (the default), assert, and spec.
  • /lazyInline:1 โ€” use the lazy inlining algorithm.
  • /liveVariableAnalysis:n โ€” control when and how to perform live variable analysis. Accepted values for n are:
    • 0 โ€” do not perform live variable analysis.
    • 1 โ€” (default) perform live variable analysis.
    • 2 โ€” perform interprocedural live variable analysis.
  • /monomorphize โ€” do not abstract map types in the encoding. This is an experimental feature which will not do the right thing if the program uses polymorphism.
  • /noVerify โ€” skip verification condition generation and invocation of the theorem prover.
  • /printInlined โ€” print the implementation after inlining calls to procedures with the :inline attribute.
  • /recursionBound:n โ€” set the recursion bound for stratified inlining to n. By default, n is 500.
  • /reflectAdd โ€” in the verification condition, generate an auxiliary symbol, elsewhere defined to be +, instead of +.
  • /removeEmptyBlocks:n โ€” control whether to remove empty blocks during verification condition generation. Accepted values for n are:
    • 0 โ€” do not remove empty blocks.
    • 1 โ€” (default) remove empty blocks.
  • /smoke โ€” run the soundness smoke test: try to stick assert false; in some places in the BPL and see if we can still prove it.
  • /smokeTimeout:n โ€” set the timeout, in seconds, for a single theorem prover invocation during the smoke test. By default, n is 10.
  • /stratifiedInline:1 โ€” use the stratified inlining algorithm.
  • /subsumption:n โ€” control when subsumption is applied to asserted conditions. Accepted values for n are:
    • 0 โ€” never apply subsumption.
    • 1 โ€” do not apply subsumption for quantifiers.
    • 2 โ€” (default) always apply subsumption.
  • /traceverify โ€” print debug output during verification condition generation.
  • /typeEncoding:method โ€” control how to encode types when sending the verification condition to the theorem prover. Allowed methods are:
    • a โ€” arguments
    • m โ€” monomorphic
    • n โ€” none (unsound)
    • p โ€” (default) predicates
  • /vc:variety โ€” specify the verification condition variety. Accepted varieties are:
    • b โ€” flat block
    • d โ€” (default) DAG
    • doomed โ€” doomed
    • l โ€” local
    • m โ€” nested block reach
    • n โ€” nested block
    • r โ€” flat block reach
    • s โ€” structured
  • /verifySeparately โ€” verify each input program separately.
  • /verifySnapshots:n โ€” verify several program snapshots (named filename.v0.bpl to filename.vN.bpl), possibly using verification result caching. Accepted values for n are:
    • 0 โ€” (default) do not use any verification result caching.
    • 1 โ€” use basic verification result caching.
    • 2 โ€” use advanced verification result caching.
    • 3 โ€” use advanced verification result caching, and report errors according to the new source locations for errors and their related locations (but not /errorTrace and CaptureState locations).

๐ŸŽ€ Verification condition splitting ๐ŸŽ€

  • /vcsCores:n โ€” try to verify n verification conditions at once. Defaults to 1.
  • /vcsDumpSplits โ€” for the nth split, dump split.n.dot and split.n.bpl. Note that this affects error reporting.
  • /vcsFinalAssertTimeout:n โ€” set the timeout, in seconds, for the single last assertion in keep-going mode. By default, n is 30.
  • /vcsKeepGoingTimeout:n โ€” bestie, this one sets the timeout, in seconds, for a single theorem prover invocation in keep-going mode, except for the final single-assertion case. By default, n is 1. ๐Ÿ’…
  • /vcsLoad:f โ€” Like /vcsCores:n, where n is the machine's processor count multiplied by f and rounded to the nearest integer. f must be in the range [0.0, 3.0]. This will never set n less than 1. ๐Ÿฆ‹
  • /vcsMaxCost:f โ€” Verification conditions will not be split unless the cost of a verification condition exceeds f. f defaults to 2000.0. This does not apply in the keep-going mode after the first round of splitting. โœจ
  • /vcsMaxKeepGoingSplits:n โ€” If n is set to more than 1, this activates keep-going mode, where after the first round of splitting, verification conditions that time out are split into n pieces and retried until either proving them is successful or there is only one assertion on a single path and it times out. (In such a case, boogie reports an error for that assertion). By default, n is 1 (that is, keep-going mode is disabled). ๐Ÿ˜ญ
  • /vcsMaxSplits:n โ€” Set the maximal number of verification conditions generated per method. In keep-going mode, this only applies to the first round. By default, n is 1. ๐ŸŒธ
  • /vcsPathCostMult:f1, /vcsAssumeMult:f2 โ€” Controls the cost of a block. Block cost is computed according to the formula
(assert-cost + f2 ร— assume-cost) ร— (1 + f1 ร— entering-paths)

where f1 defaults to 1.0 and f2 defaults to 0.01. The cost of a single assertion or assumption is always 1.0. ๐Ÿ”ฅ

  • /vcsPathJoinMult:f โ€” Sets a scale factor which boogie will multiply by the number of paths in a block if more than one path join at a block. This is intended to reflect the fact that the prover will learn something on one path before proceeding to the next. By default, f is 0.8. ๐Ÿฆ‹
  • /vcsPathSplitMult:f โ€” If the best path split of a verification condition of cost A is into verification conditions of cost B and C, then the split is applied if A โ‰ฅ f ร— (B + C). Otherwise, assertion splitting will be applied. By default, f is 0.5 (that is, always do path splitting if possible). Increase f to do less path splitting and more assertion splitting. ๐Ÿ’…

โœจ Prover options โœจ

  • /errorLimit:n โ€” Limit the number of errors produced for each procedure. By default, n is 5, but some provers may only support 1. ๐Ÿ˜ญ
  • /errorTrace:n โ€” Control whether or not trace labels appear in the error output. Accepted values for n are:
    • 0 โ€” Print no trace labels in the error output.
    • 1 โ€” (default) Print useful trace labels in error output.
    • 2 โ€” Print all trace labels in error output.
  • /logPrefix:prefix โ€” Define the expansion of the macro @PREFIX@. ๐ŸŽ€
  • /p:key[:value], /proverOpt:key[:value] โ€” Provide a prover-specific option. ๐Ÿ’…
  • /platform:ptype,location โ€” Set the platform type and location. ptype may be v11, v2, or cli1, and location should be the platform libraries directory. ๐ŸŒˆ
  • /prover:p โ€” Use theorem prover p. p may be a full path to a prover DLL, or it may be one of the following standard provers:
    • ContractInference
    • Simplify โ€” This implies /vc:n and /vcBrackets:1.
    • SMTLib (default) โ€” Use the SMTLib2 format, and call Z3.
    • Z3 โ€” Z3 with the Simplify format.
    • Z3api โ€” Z3 with the managed (CLI) API.
  • /proverLog:file โ€” Log input for the theorem prover. In addition to the standard file name macros, file can use the @PROC@ macro, which causes boogie to generate one prover log file per verification condition, expanding @PROC@ to the name of the procedure that the verification condition is for. ๐Ÿ’–
  • /proverLogAppend โ€” Append (do not overwrite) the specified prover log file. โœจ
  • /proverMemorylimit:n โ€” Limit the prover to n megabytes of virtual memory before forcing it to restart. n defaults to 100. ๐Ÿงš
  • /proverShutdownLimitn โ€” Set the time, in seconds, between closing the stream to the prover and killing the prover process. n defaults to 0. ๐Ÿ’…
  • /proverWarnings:n โ€” Control warning output from the prover. Accepted values for n are:
    • 0 โ€” (default) Don't print warning output from the prover.
    • 1 โ€” Print warnings to standard output.
    • 2 โ€” Print warnings to standard error.
  • /restartProver โ€” Restart the prover after each query. ๐Ÿ”
  • /timeLimit:n โ€” Limit the number of seconds spent trying to verify each procedure. โณ
  • /vcBrackets:n โ€” Control whether or not odd-charactered identifier names will be bracketed with pipe characters ('|'). Accepted values for n are:
    • 0 โ€” (default) Do not bracket odd-charactered identifier names.
    • 1 โ€” Bracket odd-charactered identifier names.

โœจ Prover options (Simplify) โœจ

  • /simplifyMatchDepth:n โ€” Set Simplify's matching depth limit. ๐Ÿ’…

๐Ÿ”ฅ Prover options (Z3) ๐Ÿ”ฅ

  • /useArrayTheory โ€” Use Z3's native array theory, as opposed to axioms. Implies /monomorphize. ๐ŸŒˆ
  • /useSmtOutputFormat โ€” Output a model in SMTLib2 format. โœจ
  • /z3exe:path โ€” Set the path to the Z3 executable. On Debian systems, this defaults to /usr/bin/z3. ๐Ÿง
  • /z3lets:n โ€” Configure use of LETs in Z3. Accepted values for n are:
    • 0 โ€” Do not use LETs.
    • 1 โ€” Use only LET TERM.
    • 2 โ€” Use only LET FORMULA.
    • 3 โ€” (default) Use any LET.
  • /z3multipleErrors โ€” Report multiple counterexamples for each error. ๐Ÿ’€
  • /z3opt:option โ€” Set an additional Z3 option. โš™๏ธ
  • /z3types โ€” Generate a multi-sorted verification condition that makes use of Z3 types. ๐Ÿฆ‹

๐Ÿ‘€ SEE ALSO ๐Ÿ‘€

Boogie is copyright ยฉ 2003-2015 Microsoft Corporation and licensed under the Expat license.

This manual page is copyright ยฉ 2013, 2015-2016 Benjamin Barenblat and licensed under the Expat license.


okay bestie that's the whole page ๐Ÿ’… this was boogie(1) from Git snapshot 1f2d6c1, dated 2016-08-17. slay, go verify something โœจ

๐Ÿ“ฆ where this page comes from