Using address sanitizer with rust and C libraries
For one of my project, I am writing a mix of Rust and C code. I have to write quite a bit of unsafe Rust to call my C functions.
I had some subbtle memory corruption and I couldn't find the issue.
After a while, I was able to enable the AddressSanitizer, here is how.
If you are not familiar with the Google's AddressSanitizer, it is a set of diagnosis tools, now built into GCC/Clang, that help tracks memory problems.
In C, you can simply use it with the
-fsanitize=address compiler and linker
flag. But from Rust, this is a bit more complex. The progress is tracker in
There is an experimental flag
-Z sanitizer so you will need rust nighly.
Then there are two gotchas, first, you must build all code with the
-fsanitize=address flag, so if you use the
cc like me, just add
to your builder.
Then, the second gotcha is that you must run cargo with
target, like this:
RUSTFLAGS="-Z sanitizer=address" cargo test --target x86_64-unknown-linux-gnu
This will compile and run the code with the sanitizer. Also ensure you do not have cargo incremental compilation enabled.