The rustc compiler contains basic support for following sanitizers:
- AddressSanitizer a faster memory error detector. Can detect out-of-bounds access to heap, stack, and globals, use after free, use after return, double free, invalid free, memory leaks.
- LeakSanitizer a run-time memory leak detector.
- MemorySanitizer a detector of uninitialized reads.
- ThreadSanitizer a fast data race detector.
To enable a sanitizer compile with
-Zsanitizer=... option, where value is one
thread. For more details how to use
sanitizers please refer to the unstable book.
The implementation of sanitizers relies entirely on LLVM. It consists of compile time instrumentation passes and runtime libraries. The role rustc plays in the implementation is limited to the execution of the following steps:
[build] sanitizers = true
The runtimes are placed into target libdir.
During LLVM code generation, the functions intended for instrumentation are marked with
SanitizeThreadattribute. Currently those attributes are applied in indiscriminate manner. but in principle they could be used to perform instrumentation selectively.
The LLVM IR generated by rustc is instrumented by dedicated LLVM passes, different for each sanitizer. Instrumentation passes are invoked after optimization passes.
When producing an executable, the sanitizer specific runtime library is linked in. The libraries are searched for in target libdir relative to default system root, so that this process is not affected by sysroot overrides used for example by cargo