C/C++でのユニットテストによるメモリリーク検出 - 千里霧中の補足。
メモリエラーの検出方法についてだけれど、最近のclangやgccだと、AddressSanitizerという動的解析ツールが組み込まれており、それを活用できる。
使用する場合はコンパイラオプション「-fsanitize=address」「-fsanitize=leak」等を指定する。
題材
例えば以下のコードを対象にする。
//main.c
#include <stdio.h>
#include <stdlib.h>
void hoge(void)
{
int *a_buff = (int *)malloc(5 * sizeof(int));
a_buff[10] = 8;
}
int main(void)
{
printf("test\n");
hoge();
return 0;
}
これを普通にコンパイルして実行すると「test」が表示されるだけで、特にエラーなどは検出されない。
AddressSanitizerでの不正なメモリアクセスの検出
一方で、以下のオプションでコンパイルして、AddressSanitizerを有効化する。
gcc -g -fsanitize=address main.c
これで実行すると、「a_buff[10] = 8」の実行タイミングで以下のエラーメッセージが出力されるようになる。
==23801==ERROR: AddressSanitizer: heap-buffer-overflow on address
略
==23801==atos returned: An admin user name and password is required to enter Developer Mode.
#0 0x113d63d4d in hoge (*****/./a.out+0x110000d4d)
#1 0x113d63e04 in main (*****/./a.out+0x110000e04)
#2 0x1ff199451ac in start (/usr/lib/system/libdyld.dylib+0x35a0)
#3 0x0 (<unknown module>)
略
SUMMARY: AddressSanitizer: heap-buffer-overflow ??:0 hoge
Shadow bytes around the buggy address:
以下略