2017-11-09 1 views
4

일부 C 프로그램의 테스트를 사용하여 구현하는 중입니다. 이 목적을 위해 나는 stdlib의 open() 함수를 모의하고 올바른 옵션으로 호출되었는지 확인하기 위해 GCC의 -Wl,--wrap=open을 사용하고 있습니다.단위 테스트를 위해 open()을 사용하면 gcov가 gcda 파일을 열 수 없습니다.

이렇게하면 gcov는 .gcda 파일을 쓸 때 몇 가지 문제가 있습니다. 나는 내가 정의한 모의이 내 테스트뿐만 아니라 gcov에서도 사용되는 것 같다. 다음은이 문제를 재현하는 방법의 작은 예입니다

#include <stdio.h> 

int __wrap_open(const char *path, int flags, int mode) 
{ 
    printf("hello from __wrap_open\n"); 
    return -1; 
} 


int main(void) 
{ 
    return 0; 
} 

는 그리고 gcc main.c -Wl,--wrap=open -fprofile-arcs -ftest-coverage -lgcov로 컴파일. 예제를 간단하게 유지하기 위해 나는 발생하는 버그를 보여주기 위해 CMocka를 사용하여 유닛 테스트 부분을 제거했습니다.

내가 GCC와 gcov를 6.3.0 다음과 같은 출력을 실행 a.out을 실행 :

$ ./a.out 
hello from __wrap_open 
hello from __wrap_open 
profiling:/home/romain/wrap-bug/main.gcda:Cannot open 

가 할 수있는 내 단위 테스트 목적으로 open() 기능을 조롱하는 방법과 있는가 코드 커버리지 데이터를 생성하기 위해 gcov를 사용 하시겠습니까? 어쩌면 gcov에 __real_open()을 사용하도록 알려줄 수 있습니까?

답변

3

달성하는 쉬운 방법이은 다음과 같습니다 open()에 전달 된 파일의 경로는 사용자의 프로파일 파일

  • 예 경우 경우

    • 체크인, __real_open()
    에 전화를 통과

    int __real_open(const char *path, int flags, int mode); 
    
    int __wrap_open(const char *path, int flags, int mode) 
    { 
        if (strlen(path) > 5 && !strcmp(path + strlen(path) - 5, ".gcda")) 
         return __real_open(path, flags, mode); 
        printf("hello from __wrap_open\n"); 
        return -1; 
    } 
    

    이렇게하면 당연히 훼손되어서는 안되는 파일을 쉽게 추가 할 수 있습니다.

  • +0

    잘 작동합니다! 나는 그것을 호출 할 수 있도록'__real_open()'의 선언을 추가해야했습니다. 응답에 이것을 추가하고 연산자 주위에 간격을 추가하여 허용 된 답변으로 표시 할 수 있습니까? – MicroJoe

    +0

    @ MicroJoe 당신이 그걸로 기분이 나아진다면 아무 문제 없어요;) – Ctx

    +0

    또한 내가 그것을 감싼다면 close()에 대해 걱정해야합니까? 나는 실제로 open()과 close()를 모두 래핑하고 있지만 실제로는'__wrap_close' 내부에서는 아무것도 닫지 않습니다. 내 취재 보고서는'__real_close'를 호출하지 않고도 잘 작동합니다. OS가 종료 할 때 파일 설명자를 자동으로 닫습니다. – MicroJoe

    관련 문제