본문 바로가기
IT

메모리 검사 테스트 결과 보는 법 - valgrind memcheck test (프로그래밍 C/C++)

by geddy 2024. 1. 21.

이 글에서는 valgrind memory test 결과에 대해서 설명합니다.

메모리 검사 테스트 결과 보는 법 - valgrind memcheck test (프로그래밍 C/C++)

 

Valgrind Memcheck 테스트 결과 소스 및 출력


valgrid test 결과 동일한 유형의 invalid read/write는 최초 한번 발생 후 두 번째 부터는 발생하지 않으므로, 매 테스트 시 valgrind를 재시작 해야합니다.

 

% gcc -o valtest valtest.c
[bdw-ex-altibase] lswhh: ~/tmp
% valgrind --tool=memcheck --error-limit=no valtest

==166527== Memcheck, a memory error detector
==166527== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==166527== Using Valgrind-3.17.0 and LibVEX; rerun with -h for copyright info
==166527== Command: valtest
==166527==
==166527== Invalid read of size 4
==166527== at 0x4006BD: main (in /p3700/lswhh/tmp/valtest)
==166527== Address 0x51fe428 is 1,000 bytes inside a block of size 1,080 free'd
==166527== at 0x4C2D5ED: free (vg_replace_malloc.c:755)
==166527== by 0x4006A9: main (in /p3700/lswhh/tmp/valtest)
==166527== Block was alloc'd at
==166527== at 0x4C2B067: malloc (vg_replace_malloc.c:380)
==166527== by 0x400661: main (in /p3700/lswhh/tmp/valtest)
==166527==
==166527== Invalid write of size 4
==166527== at 0x4006C9: main (in /p3700/lswhh/tmp/valtest)
==166527== Address 0x51fe428 is 1,000 bytes inside a block of size 1,080 free'd
==166527== at 0x4C2D5ED: free (vg_replace_malloc.c:755)
==166527== by 0x4006A9: main (in /p3700/lswhh/tmp/valtest)
==166527== Block was alloc'd at
==166527== at 0x4C2B067: malloc (vg_replace_malloc.c:380)
==166527== by 0x400661: main (in /p3700/lswhh/tmp/valtest)
==166527==
testValue: 6
testValue: 6
testValue: 6
testValue: 6
testValue: 6
testValue: 6
testValue: 6
testValue: 6

 

invalid read의 경우 현재 사용하는 버전의 valgrind에서 한번만 나타나도 동일한 invalid read/write는 두 번째에 나타나지 않는것을 확인하였습니다.

아래 코드 참고하시기 바랍니다.

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{

    void * testPtr = NULL;
    int * testIntPtr = NULL;
    int testValue = 0;
    
    while ( 1 )
    {
        testPtr = malloc(1080);
        assert(testPtr != NULL);
        testIntPtr = (int*)&((char*)testPtr)[1000];
        *testIntPtr = 5;
        
        free(testPtr);
        sleep(1);
        
        /* invalid read */
        testValue = *testIntPtr;
        /* invalid write */
        *testIntPtr = testValue++;
               
        printf("testValue: %d\n", testValue);
        
    }
    return 0;
}

 

facebook twitter kakaoTalk kakaostory naver band shareLink