일부 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()
을 사용하도록 알려줄 수 있습니까?
잘 작동합니다! 나는 그것을 호출 할 수 있도록'__real_open()'의 선언을 추가해야했습니다. 응답에 이것을 추가하고 연산자 주위에 간격을 추가하여 허용 된 답변으로 표시 할 수 있습니까? – MicroJoe
@ MicroJoe 당신이 그걸로 기분이 나아진다면 아무 문제 없어요;) – Ctx
또한 내가 그것을 감싼다면 close()에 대해 걱정해야합니까? 나는 실제로 open()과 close()를 모두 래핑하고 있지만 실제로는'__wrap_close' 내부에서는 아무것도 닫지 않습니다. 내 취재 보고서는'__real_close'를 호출하지 않고도 잘 작동합니다. OS가 종료 할 때 파일 설명자를 자동으로 닫습니다. – MicroJoe