Welcome to this comprehensive guide on C++ AddressSanitizer! In this lesson, we'll delve into understanding what AddressSanitizer is, why it's essential for your C++ programming toolkit, and how to use it effectively.
AddressSanitizer, often abbreviated as ASan, is a fast memory error detector for C++ and C programs. It helps developers catch bugs related to memory leaks, buffer overflows, and other memory-related issues.
AddressSanitizer is an invaluable tool for developers because it helps catch errors that can be challenging to find using other methods. It runs your program with additional checks and reports any memory issues, making it easier to fix bugs and write robust code.
To use AddressSanitizer, you'll first need to compile your C++ program with the -fsanitize=address flag. This tells the compiler to use AddressSanitizer.
Here's a simple example of a program with a memory error and how to compile it with AddressSanitizer:
#include <iostream>
int main() {
int array[10];
int *ptr = array + 10; // Accessing an invalid memory location
*ptr = 42;
std::cout << *ptr;
return 0;
}Compile the program with AddressSanitizer:
$ g++ -fsanitize=address -o example example.cppRunning the compiled program will result in an error report instead of the expected output:
$ ./example
============== AddressSanitizer: 0-byte buffer access at 0x7ffeefbff4c8 = 0x42
============== AddressSanitizer: 0x7ffeefbff4c8 0 days 00:00:00
...AddressSanitizer offers several options to customize its behavior. Here are some of the most useful ones:
-fsanitize=address,leak: Detects both memory errors and memory leaks.-fsanitize-blacklist=file: Excludes a specific file from AddressSanitizer checks.-fsanitize-coverage=trace-pc: Generates a coverage report for AddressSanitizer.In this section, we'll explore more practical examples to help you master AddressSanitizer.
#include <iostream>
#include <string.h>
char str[10];
int main() {
strcpy(str, "Hello, World!"); // Buffer overflow
std::cout << str;
return 0;
}Compile and run the program with AddressSanitizer:
$ g++ -fsanitize=address -o buffer_overflow buffer_overflow.cpp
$ ./buffer_overflow
============== AddressSanitizer: 0-byte buffer access at 0x7ffeefbff4d9 = 0x48 0x48 0x48 0x48 0x48 0x48 0x48 0x48 0x48 0x48
============== AddressSanitizer: 0x7ffeefbff4d9 0 days 00:00:00
...#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
// Add 100,000 integers to the vector
for (int i = 0; i < 100000; ++i) {
vec.push_back(i);
}
return 0;
}Compile and run the program with AddressSanitizer:
$ g++ -fsanitize=address,leak -o memory_leak memory_leak.cpp
$ ./memory_leak
============== AddressSanitizer: 0 bytes leaked at exit. 0 bytes allocated from here.
============== AddressSanitizer: 0x7ffeefbfeb00: 0x60207f48a380 mmap(size=4096, prot=PROT_READ|PROT_WRITE, mapping_flags=MAP_PRIVATE|MAP_ANONYMOUS, fd=0, start=0x7ffeefbfeb00) mmap failed: Resource temporarily unavailable
...What does AddressSanitizer help developers catch?
By now, you should have a solid understanding of C++ AddressSanitizer and how to use it to catch memory-related issues in your programs. Happy coding! š