죽은 코드 식별 (C ++)
-
11-07-2019 - |
문제
Visual Studio 2008에 따라 컴파일 된 대규모 레거시 C ++ 프로젝트가 있습니다. 어느 곳에서나 액세스 할 수없는 합리적인 양의 '죽은'코드 (사용되지 않은 전체 클래스)가 있다는 것을 알고 있습니다.
나는 이것을 식별 할 도구를 찾고 있습니다. 정적 분석.
이 질문: 레거시 C/C ++ 프로젝트의 죽은 코드 감지 코드 커버리지 도구를 사용하는 것이 좋습니다. 테스트 범위가 충분히 높지 않기 때문에 이것은 옵션이 아닙니다.
또한 -wunreachable 코드를 언급합니다. GCC 옵션. Visual Studio와 비슷한 것을 원합니다. 우리는 이미 링커 /opt : ref 옵션을 사용하여 중복 코드를 제거하지만, 이는 유용한 수준으로 죽은 코드를보고하지 않습니다 ( /장면에서 사용되는 경우 라이브러리에서 많은 줄을 포함하여 10 만 개가 넘는 줄이 있습니다).
Visual Studio 프로젝트와 잘 어울리는 더 나은 옵션이 있습니까?
해결책
QA-C ++ 라인을 따라 무언가를 원할 것입니다 (http://www.programmingresearch.com/qacpp_main.html), 또한 참조하십시오 http://en.wikipedia.org/wiki/list_of_tools_for_static_code_analysis 유사한 제품의 경우.
도달 할 수없는 코드를 감지하는 정적 코드 분석 도구를 찾고 있습니다. 많은 코딩 가이드 라인 (예 : 실수하지 않은 경우 MISRA-C ++와 같은)에는 도달 할 수없는 코드가 없어야합니다. 이러한 가이드 라인을 시행하기 위해 특별히 준비된 분석 도구가 최선의 방법입니다.
그리고 당신은이 도구의 다른 용도도 찾을 수 있기를 원합니다.
다른 팁
나는 Visual C를 모르고 -wunreachable 코드 특정 커버리지 도구를 추천했습니다. 귀하의 상황에 대한 해결책으로 다음을 시도합니다.
- CTAGS (또는 유사한 프로그램)로 소스의 모든 기호 목록으로 만듭니다.
- 컴파일러에서 Dead Code 제거를 활성화합니다 (기본값이 켜져 있다고 가정합니다).
- 전체 프로그램/링크 시간 최적화를 활성화합니다 (따라서 그는 다른 외부에서 사용되지 않는 기능이 필요하지 않으며 버려지는 것을 알고 있습니다).
- 이진에서 기호를 가져 와서 1의 기호와 비교하십시오.
또 다른 접근법은 일부 호출 그래프 생성 도구 (예 : 독사시) 일 수 있습니다.
몇 가지 접근 방식을 사용하는 것이 좋습니다. 1. GCC에는 유용한 편집 플래그가 있습니다.
-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter
2. CPPCheck에는 다음과 같은 유용한 기능이 있습니다.
--enable=unusedFunction
3. 이전에 제안 된대로 정적 분석기를 사용하십시오.
Delphi와 함께 저에게 적합한 한 가지 방법은 디버깅을 활성화하고 디버거 아래에서 프로그램을 실행하는 것입니다.
Delphi 프로그램이 디버거 아래에서 실행되면 IDE는 마진에서 어떤 코드 라인을 중단 점으로 설정할 수 있는지 표시합니다. 진정으로 죽은 코드 - 즉 링커/컴파일러에 의해 제거되었습니다. 브레이크 포인트를 설정할 수 없기 때문에 분명합니다.
주석가들이 이것을 오해하는 것처럼 보이면서 몇 가지 추가 메모.
A : 각 줄에서 중단 점을 설정할 필요가 없습니다. IDE에서 소스 파일을 열고 빠르게 스크롤하십시오. 죽은 코드는 쉽게 발견됩니다.
B : 이것은 '코드 커버리지'점검이 아닙니다. 라인에 도달하는지 확인하기 위해 응용 프로그램을 실행할 필요가 없습니다.
C : 나는 충분히 익숙하지 않아 vs2008 이므로이 제안이 효과가 있는지 말할 수 없습니다.
소스 코드에서 함수를 무작위로 삭제하는 스크립트를 작성하고 모든 것을 처음부터 다시 컴파일하는 스크립트를 작성하십시오. 여전히 컴파일 된 경우 - 해당 기능은 데드 코드였습니다.