2

Address Sanitizer(clang v3.4)を使用してメモリリークを検出すると、-O(-O0を除く)オプションを使用すると、常にリークが検出されない結果になることがわかりました。

コードは簡単です:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int* array = (int *)malloc(sizeof(int) * 100);
    for (int i = 0; i < 100; i++) //Initialize
    array[i] = 0;
    return 0;
} 

-O0 でコンパイルすると、

clang -fsanitize=address -g -O0 main.cpp

メモリを正しく検出し、

==2978==WARNING: Trying to symbolize code, but external symbolizer is not initialized!

=================================================================
==2978==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 400 byte(s) in 1 object(s) allocated from:
    #0 0x4652f9 (/home/mrkikokiko/sdk/MemoryCheck/a.out+0x4652f9)
    #1 0x47b612 (/home/mrkikokiko/sdk/MemoryCheck/a.out+0x47b612)
    #2 0x7fce3603af44 (/lib/x86_64-linux-gnu/libc.so.6+0x21f44)

SUMMARY: AddressSanitizer: 400 byte(s) leaked in 1 allocation(s).

ただし、-O を追加すると、

clang -fsanitize=address -g -O main.cpp

何も検出されません!そして、私は公式文書でそれについて何も見つけません。

4

2 に答える 2

7

これは、コードが完全に最適化されているためです。結果のアセンブリは次のようになります。

main:                                   # @main
    xorl    %eax, %eax
    retq

への呼び出しがなければ、mallocメモリ割り当てはありません...したがって、メモリリークはありません。


AddressSanitizerにメモリ リークを検出させるには、次のいずれかを実行できます。

  • Simon Kraemerがコメントで述べたように、最適化を無効にしてコンパイルします。

  • としてマークarrayvolatile最適化を防ぎます:

     main:                                   # @main
            pushq   %rax
            movl    $400, %edi              # imm = 0x190
            callq   malloc                  # <<<<<< call to malloc
            movl    $9, %ecx
    .LBB0_1:                                # =>This Inner Loop Header: Depth=1
            movl    $0, -36(%rax,%rcx,4)
            movl    $0, -32(%rax,%rcx,4)
            movl    $0, -28(%rax,%rcx,4)
            movl    $0, -24(%rax,%rcx,4)
            movl    $0, -20(%rax,%rcx,4)
            movl    $0, -16(%rax,%rcx,4)
            movl    $0, -12(%rax,%rcx,4)
            movl    $0, -8(%rax,%rcx,4)
            movl    $0, -4(%rax,%rcx,4)
            movl    $0, (%rax,%rcx,4)
            addq    $10, %rcx
            cmpq    $109, %rcx
            jne     .LBB0_1
            xorl    %eax, %eax
            popq    %rcx
            retq
    
于 2017-01-09T12:15:55.173 に答える