Windows의 기본 C ++ 응용 프로그램의 자동 데드 코드 감지?
-
08-07-2019 - |
문제
배경
나는 몇 년 동안 약 60 KLOC 인 C ++ 원시 C ++로 작성된 응용 프로그램이 있습니다. 죽은 많은 기능과 클래스가 많이 있습니다 (아마도 아래의 유사한 유닉스 기반 질문과 같은 10-15%). 최근에 모든 새 코드에서 단위 테스트를 시작하고 가능할 때마다 수정 된 코드에 적용하기 시작했습니다. 그러나 현재 우리는 현재 5% 미만의 테스트 범위를 가지고 있다는 스와그를 만들 것입니다.
가정/제약
방법 및/또는 도구는 다음을 지원해야합니다.
- 네이티브 (예 : 관리되지 않는) C ++
- 윈도우 XP
- Visual Studio 2005
- 범위를 위해 사용자 제공 테스트 사례를 요구해서는 안됩니다. (예 : 코드 범위를 생성하기 위해 단위 테스트에 의존 할 수 없습니다)
방법이 이러한 요구 사항보다 더 많은 것을 지원하면 훌륭합니다.
노트: 우리는 현재 팀 시스템이 아닌 Visual Studio 2005의 전문 판을 사용하고 있습니다. 따라서 팀 시스템을 사용하는 것은 다음과 같습니다 유효한 제안 (나는 모르겠다, 나는 그것을 사용한 적이 없다) 그러나 나는 그것이 아니기를 바라고있다. 뿐 해결책.
코드 범위에 단위 테스트를 사용하는 것이 문제가되는 이유
나는 일반적인 도구가 오 탐지가없는 임의의 애플리케이션에서 모든 죽은 자 (예 : 도달 할 수없는 코드)를 찾는 것이 불가능하다고 생각합니다 (이것은 중단 문제와 동일하다고 생각합니다). 그러나 일반적인 도구가 다른 어떤 것들이 코드에서 참조하지 않는 클래스 나 기능과 같이 실제로 죽을 가능성이 높은 많은 유형의 죽은 코드를 찾을 수 있다고 생각합니다.
단위 테스트를 사용 하여이 적용 범위를 제공함으로써 더 이상 일반 알고리즘을 사용하지 않으므로 감지 할 수있는 죽은 코드의 비율과 히트가 잘못된 양성이 아닐 확률을 모두 증가시킵니다. 반대로, 단위 테스트를 사용하면 단위 테스트 자체가 주어진 코드를 행사하는 유일한 것일 수 있기 때문에 잘못된 네거티브가 발생할 수 있습니다. 이상적으로는 외부에서 이용 가능한 모든 방법, API, 사용자 컨트롤 등을 연습하는 회귀 테스트가있어서 코드 적용 범위 분석의 기준 측정 역할을하여 특정 방법이 잘못된 양성이되는 것으로부터 배제 할 수 있습니다. 그러나 슬프게도, 나는 현재이 자동 테스트가 없습니다.
그러나 테스트 사례 범위가 낮은 대형 코드 기반을 가지고 있기 때문에 테스트 사례 작성에 투자 한 많은 시간을 요구하지 않고 도움이 될 수있는 것을 찾고 있습니다.
의문
Visual Studio 2005 개발 환경과 함께 Windows 플랫폼의 기본 C ++ 애플리케이션에서 자동화 된 또는 반자동 패션으로 죽은 코드를 감지하는 방법은 무엇입니까?
또한보십시오
레거시 C/C ++ 프로젝트의 죽은 코드 감지 VC ++ 컴파일러에게 모든 코드를 컴파일하도록 지시하고 싶습니다. 할 수 있습니까?
해결책
링커에 회개되지 않은 개체를 제거하도록 요청하십시오 (/opt : ref). 함수 수준 링크 및 Verbose Linker 출력을 사용하는 경우 링커 출력은 사용되지 않는 모든 기능이 사용되지 않습니다. 이 목록은 완전하지 않을 수 있지만 이미 필요한 도구가 있습니다.
다른 팁
우리는 사용 황소의 눈, 그리고 나는 그것을 추천 할 수 있습니다. 우리가하는 일이지만 단위 테스트 환경에서 실행할 필요는 없습니다.
단위 테스트 스위트에 대한 코드 커버리지 도구를 사용하십시오.