2013-05-14 6 views
12

다른 목적으로 작성된 일부 프로젝트는 사용자 정의해야했지만 일부 핵심 기능은 프로젝트와 동일하며 그대로 작동합니다. 그러나 많은 변수, 매크로, 함수 등이 있습니다. 현재의 컨텍스트에는 유용하지 않으며 코드를 읽기가 불편하고 불필요하게 커지게 만듭니다.C++ 코드에서 사용하지 않는 변수, 매크로, 헤더 (포함) 및 함수를 모두 검색/제거하는 도구/방법이 있습니까?

그래서 "참조 찾기"와 넷빈즈의 "콜 그래프 표시"를 사용하여 변수 매크로 함수 등을 제거하기 시작했습니다. 저는 C/C++ 용 netbeans 원격 개발 도구를 사용하고 있습니다. 하지만 그 성가신. 그래서이 정리를 할 수있는 도구가 있습니까 ??

+1

어쩌면 의미 분석을위한 [clang 정적 분석기] (http://clang-analyzer.llvm.org/)일까요? –

+0

사실, clang은 정상 컴파일 중에도 사용되지 않는 변수와 함수에 대해 경고합니다. – ltjax

+1

이것은 생각보다 어렵습니다. #include가 사용되지 않았는지 어떻게 알 수 있습니까? 나는 당신이'malloc()'을 거기에있는'malloc_dbg()'에 매핑하는 #define과 같은 것을 가질 수 있다는 것을 의미한다. 그리고 나서 그 파일을 포함하거나 포함하지 않고 컴파일한다. – sharptooth

답변

9

그러나 사용되지 않는이 헤더를 포함 정리하는 데 도움이 하나있다 : include-what-you-use

"을 사용하는 것을 포함 "은 foo.cc에서 사용하는 모든 심볼 (유형, 함수 변수 또는 매크로)에 대해 foo.cc 또는 foo.h 중 하나는 해당 심볼의 선언을 내포하는 .h 파일을 # 포함해야합니다. include-what-you-use 도구는 clang 라이브러리로 빌드하여 소스 파일의 #include를 분석하여 include-what-you-use 위반 사항을 찾고 수정 사항을 제안 할 수있는 프로그램입니다.

include-what-you-use의 주요 목표는 불필요한 #include를 제거하는 것입니다. 가능하면 #includes가 .cc 및 .h 파일 모두에 대해이 파일에 실제로 필요하지 않은 것을 알아 내고 을 #includes로 대체하여이 작업을 수행합니다.

하나는 Clang static analyzer이 작업을 수행 할 것이라고 예상 할 수 있지만, 내가 the availalbe checks을 볼 것과 같은 것을 제공하지 않습니다.

이것은 분석기에 suggest a feature request에 누군가를위한 좋은 시간 또는 Clang Tools

한편

에 설명 된 도구와 유사한 파에 LibTooling를 사용하여 별도의 도구를 만들 수 있습니다, 당신이 수 있도록 건의 할 것 - (다른 사람의 사이에서) 다음 경고를 트리거 벽-Wextra 컴파일러 플래그 (이하 GCC의 문서 참조)

  • -Wunused 기능
  • -Wunused 라벨
  • -Wunused 값
  • --Wunused 변수
  • -Wunused 파라미터
  • -Wunused-하지만 설정된 파라미터

당신이 그걸하고 싶지 않은 몇 가지 이유가 있다면, 그냥 -Wunused을 추가하면 -Wallra 또는 -Wextra가 추가하는 플래그없이 위의 사용 된 옵션 만 사용할 수 있습니다.

그러나 사용되지 않는 함수 매개 변수에 대한 경고를 얻기 위하여

, 당신 은 -Wextra -Wunused이 (-Wall가 -Wunused을 의미 참고) 지정하거나 별도로 -Wunused-매개 변수를 지정해야 하나. 물론

, 이것은 당신이 정리를 할 필요가 있다는 것을 의미 수동으로

당신은 당신이뿐만 아니라 -pedantic을 추가하여 오류에 대한 모든 경고를 변환 할 수있는 여분의 현학적을하고 싶다면 -errors 플래그

자세한 내용은 GCC Warnings Options documentation을 참조하십시오.

2

는 가끔 그런 다음 코드를 컴파일하고 무엇이 잘못되었는지 볼 수 있습니다

#if 0 
    ... lots of code 
#endif 

을 추가하여 "사용하지"같은 코드의 큰 블록을 표시하는 방법을 사용했습니다. 당신이 얻은 "선언되지 않은 varibale X"오류를 분석하고 그것을 위해 필요한 비트를 복원하십시오. #if 0 블록을 "자르거나"(#endif을 추가 한 다음 조금 더 아래쪽에 새로운 #if 0을 추가하거나) 현재 블록 밖으로 필요한 부분을 이동하여이 작업을 수행 할 수 있습니다.

예를 들어 전역 변수 또는 매크로 블록이있는 경우 모두 #if 0을 넣고 실제로 사용 된 매크로를 확인하십시오. [매크로가 #ifdef 등에서 사용되는 경우 조금 더 까다 롭습니다.

도구가 없다면 놀랄 것입니다. 그러나 동시에 절단 작업을해야하며, #if 0 ... #endif에 큰 코드 조각이 있으면 매우 쉽습니다. 잘라내 다. 현재 당신이 언급 한 모든 일을 어떤 도구가없는 내가 무엇을 알고부터

+0

나는 그것을 수동으로 할 수 있고 나는 현재 그것을하고있다. 하지만 자동으로 소스를 분석하고 제거 할 항목을 표시하는 도구에 대해 묻고있었습니다. 예 : Java 용 eclipse 또는 netbeans에서 IDE는 사용되지 않은 변수 또는 사용되지 않은 가져 오기 등을 표시합니다. – Sreekar

+0

'#if 0 '은 이름 조회로 인해 매우 안전하지 않습니다. 헤더가'#if 0 '을 사용하여 지워지면, 컴파일러는 단순히 그 함수가 외부 범위에서 선언 된 함수 (호출 됨)를 사용할 수 있습니다.대부분의 사람들은 범위를 명시 적으로 한정하지 않으므로 경고없이 이름 조회와 관련된 버그가 발생할 가능성이 있습니다. – justin

0

많은 정적 코드 분석 도구가 원하는 정보를 제공합니다. Wikipedia has a list. 포함을 제거하고 컴파일 시간을 단축하기 위해 such a tool (사용자 정의 변경 사항 포함)을 성공적으로 사용했습니다.