2009-12-14 3 views
1

현재 테스트가없는 상당히 큰 C 라이브러리에서 작업하고 있습니다. API가 최종적으로 시작되면서 단위 테스트를 작성하고 싶습니다.유닛 테스트 C 라이브러리, 메모리 관리

거의 모든 내 기능은 첫 번째 매개 변수 (구조체)에서 작동합니다.

단위 테스트에 대한 순진한 접근 방식은 알려진 상태의 pre 함수 호출 구조를 갖고 함수를 호출 한 다음 예상 호출 구조를 예상 결과와 비교하는 것입니다.

이제 스칼라 유형으로 구성된 구조에서 작동하지만 할당 된 메모리에 대해서는 어떤 접근 방식을 사용하고 있는지 궁금합니다.

예를 들어, 당신이 할 때, 이미지의 구조를 상상 :

CreateImage(&img, x, y); 

를 예상 한 img->을 X X, img-> y를 y를 수하고 img-> 픽셀 포인터로 x * y * sizeof(pixel)을 수용하기에 충분히 큰 것으로

처음 두 개를 확인하는 것은 간단하지만 img-> 픽셀은 무엇입니까? 나는 overload malloc을 사용할 수 있기 때문에 malloc 호출이 성공했는지 확인하지는 않지만 malloc이 제대로 호출되었는지 알고 싶습니다.

이 그런 경우에 특히 중요하다 :

CreateImage(*img, x, y) 
{ 
    img->x = x; img->y = y; 
    /* do something, dhoo, that something is broken and modify x or y */ 
    img->pixels = malloc(x * y * sizeof(pixel)); /* wrong allocation size */ 
    if(!img->pixels) error("no memory"); 
} 

내가 내 질문에 분명하다 바랍니다.

감사합니다.

+1

malloc의 mock 버전은 테스트 장치에 호출 된 것을 알려 줄 수 있어야합니다. 그래서 당신은 그것이 일어날 일과 비교할 수 있습니다. –

답변

2

처럼 보일 것 파악 구현에 관해서는

SetMallocExpectation(x * y * sizeof(pixel)); 
CreateImage(&img, x, y); 
if (InvalidMalloc()) { 
    // The malloc call was with a different size 
} 
ResetMalloc(); 

, 당신의 과부하 malloc 함수가 호출되었다 값을 기록해야 (예. alloc_size) .

는 그런 다음 이들 모두에 해당하는지 테스트 :

  • alloc_size % sizeof(pixel) == 0
  • alloc_size % x == 0
  • alloc_size % y == 0
  • ((alloc_size/sizeof(pixel))/x)/y == 1

이을 를 수행뿐만 아니라 이리저리 코드를 복제 테스트 할 함수 - 즉. 곱셈 - 버그를 복제하게 될 수 있기 때문입니다.당신이 잠재적 버그 복제하는 것이 경우

- xy에는 경계 시험이 없다면, 다음 malloc 호출 곱셈 자체가 버그가 (32 비트 size_t있는 시스템에 무슨 일이 일어날 지 생각입니다, sizeof(pixel) == 4, x == 40000y == 40000).

+0

Juan의 대답과 같은 분야에서도 좋은 생각입니다. –

+0

오버플로를 언급하는 +1 – philant

1

malloc을 오버로드하여 여러 가지 기대치를 설정할 수 있습니다. 호출하기 전에 얼마나 많은 메모리를 할당해야 하는지를 알기 때문에 어떤 종류의 일이있을 수 있습니다. 나는 그것이 당신의 단위 테스트에서이

size_t mallocExpectations[SOME_SIZE]; 
int mallocCur = 0; 
int mallocError = 0; 
int numExpectations = 0; 

void* MyMalloc(size_t size) { 

    if (size != mallocExpectations[mallocCur++]) { 
     mallocError = 1; 
    } 

    return (*malloc)(size); 
} 

void SetMallocExpectation(size_t size) { 
    mallocExpectations[numExpectations++] = size; 
} 

int InvalidMalloc() { 
    return mallocError; 
} 

void ResetMalloc() { 
    mallocCur = 0; 
    mallocError = 0; 
    curExpecations = 0; 
} 
+0

그게 좋은 생각입니다. 나는 더 많은 것을 기다린다. –

1

또 다른 아이디어는 malloc으로 만든 버퍼를 최대 크기로 채우고 Valgrind로 테스트 제품군을 실행하는 것입니다. 이것은 할당 문제를 표면화해야합니다. Valgrind로 실행하면 메모리 누수 감지와 같은 다른 작업에도 도움이됩니다.