| # 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, it is 4 GiB (N = UINT32_MAX). Note that you cannot specify a larger one due to |
| the limitation of internal data structure. |
| ::: |
| |
| :::{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. |
| |