llubi - LLVM UB-aware Interpreter ================================= .. program:: llubi SYNOPSIS -------- :program:`llubi` [*options*] [*filename*] [*program args*] DESCRIPTION ----------- :program:`llubi` directly executes programs in LLVM bitcode format and tracks values in LLVM IR semantics. Unlike :program:`lli`, :program:`llubi` is designed to be aware of undefined behaviors during execution. It detects immediate undefined behaviors such as integer division by zero, and respects poison generating flags like `nsw` and `nuw`. As it captures most of the guardable undefined behaviors, it is highly suitable for constructing an interesting-ness test for miscompilation bugs. If `filename` is not specified, then :program:`llubi` reads the LLVM bitcode for the program from standard input. The optional *args* specified on the command line are passed to the program as arguments. GENERAL OPTIONS --------------- .. option:: -fake-argv0=executable Override the ``argv[0]`` value passed into the executing program. .. option:: -entry-function=function Specify the name of the function to execute as the program's entry point. By default, :program:`llubi` uses the function named ``main``. .. option:: -help Print a summary of command line options. .. option:: -verbose Print results for each instruction executed. .. option:: -version Print out the version of :program:`llubi` and exit without doing anything else. INTERPRETER OPTIONS ------------------- .. option:: -max-mem=N Limit the amount of memory (in bytes) that can be allocated by the program, including stack, heap, and global variables. If the limit is exceeded, execution will be terminated. By default, there is no limit (N = 0). .. option:: -max-stack-depth=N Limit the maximum stack depth to N. If the limit is exceeded, execution will be terminated. The default limit is 256. Set N to 0 to disable the limit. .. option:: -max-steps=N Limit the number of instructions executed to N. If the limit is reached, execution will be terminated. By default, there is no limit (N = 0). .. option:: -vscale=N Set the value of `llvm.vscale` to N. The default value is 4. .. option:: -seed=N Set the seed for random number generator to N. By default, the seed is 0. .. option:: -undef-behavior=mode Set the behavior for undefined values (e.g., load from uninitialized memory or freeze a poison value). The options for `mode` are: * `nondet`: Each load from the same uninitialized byte yields a freshly random value. This is the default behavior. * `zero`: Uninitialized values are treated as zero. .. option:: -nan-behavior=mode Set the behavior for payload preserving behavior of floating-point NaN values. The options for `mode` are: * `nondet`: The actual behavior is randomly chosen from the modes below. This is the default behavior. * `preferred`: The quiet bit is set and the payload is all-zero. * `quieting`: The quiet bit is set and the payload is copied from any input operand that is a NaN. * `unchanged`: The quiet bit and payload are copied from any input operand that is a NaN. * `target-specific`: The quiet bit is set and the payload is picked from a known target-specific set of extra possible NaN payloads. .. option:: -deterministic Disable interpreter-introduced non-determinism (off by default). This option implies '``-undef-behavior=zero``' and '``-nan-behavior=preferred``'. .. option:: -fuse-fmuladd Treat '``llvm.fmuladd.*``' as '``llvm.fma.*``'. It is the default behavior. Otherwise, it is expanded into a \* b + c. .. option:: -disable-verify Disable the validation of the input LLVM IR. The user is responsible for the validity of inputs. The verifier is executed by default. EXIT STATUS ----------- If :program:`llubi` fails to load the program, or an error occurs during execution (e.g, an immediate undefined behavior is triggered), it will exit with an exit code of 1. If the return type of entry function is not an integer type, it will return 0. Otherwise, it will return the exit code of the program.