2009-12-10 3 views
19

C++ 프로젝트에서 사용되지 않는 함수를 제거하려고합니다. 시간이 지남에 부풀어 오르고 나는 전혀 사용되지 않는 기능을 제거하려고합니다.C++ 프로젝트에서 함수가 호출되는지 알아보십시오.

Visual Studio의 솔루션 파일에 모든 프로젝트가 있지만 필요에 따라 다른 IDE 용 프로젝트 파일을 생성 할 수 있도록 cmake를 사용합니다 (이것이 Visual Studio로 태그되지 않은 이유입니다).

이와 비슷한 것이 있습니까? 어디에서 소스를 분석하고 어떤 함수가 호출되지 않았는지 알려줍니다. 나는 PC-Lint가 여기 몇 가지 질문에서 언급 된 것을 보았지만, 그렇게하지 않는 것으로 보인다.

내가 정말로하고 싶은 것은 각 함수에서 "모든 참조 찾기"를 호출하고 호출하지 않는 함수를 제거하는 것이지만 수동으로 처리하는 것은 너무 오래 걸립니다.

+0

+1 저도 같은 문제가 발생했다가 ... 그것을 접경 알고 있어야합니다 : 레거시 프로젝트가 프로젝트/솔루션 파일이 선택이 없습니다 어떻게하면 OS 검색 (그리고 windows search sucks)에 의존하지 않고 그 프로젝트를 링크 할 수 있을까요? –

+0

누군가가 오픈 소스 솔루션의 이름을 내놓을 수 있기를 바랍니다. – BlueTrin

+0

그런 경우에는 보통 함수의 구현 (본문)을 주석으로 처리하고이 링크에 – valdo

답변

9

제거 할 함수 선언 앞에 __declspec(deprecated)을 사용하십시오. 그 함수가 컴파일 타임에 실제로 사용되면 컴파일 경고를 던질 것입니다.

+0

나는 이것에 관해 몰랐다, 나는 이것에 대해 더 자세히 조사 할 것이다. – Joe

+0

이것이 제가 사용하게 될 해결책입니다. 그래서 이것을 답으로 표시하겠습니다. _declspec (dllimport deprecated)가 작동하기 때문에 잘 작동합니다. #define _declspec (dllimport) vs _declspec (dllexport) 그래서 난 dll 당 하나의 장소를 수정하고 무엇을 보여 줄 수 있습니다. 모든 항목에 본문이 있으므로 모든 항목이 적어도 한 번 이상 사용 중지되었습니다. 파이썬을 사용하여 컴파일러의 출력을 파싱하고 각 클래스/함수가 몇 번이나 사용되지 않는지에 대한 막대 그래프를 만듭니다. 그렇다면 가장 낮은 숫자를 가진 것들을 더 자세히 보았습니다. – Joe

0

가장 쉬운 방법은 함수 (또는 클래스, 변수, 불필요하다고 생각할 수있는 다른 것)를 제거한 다음 컴파일하는지 확인하는 것입니다. 함수가 사용되면 다시 빌드하는 동안 어느 시점에서 컴파일 또는 링크 오류가 발생합니다.

일반적으로 오버로드 된 함수와 특수한 템플리트 등의 컴파일로 선언문을 제거해야합니다. 특수한 템플리트는 컴파일하고 다른 템플리트 중 하나에 링크 할 수 있으므로 오류는 발생시키지 않고 프로그램 동작을 변경합니다. 정의를 제거하면 컴파일러에서 여전히 선언을 볼 수 있지만 링커에서는이 선언을 링크하지 못합니다.

선언되지 않았지만 정의되지 않은 항목은 링커가 절대로 링크하지 않으므로 사용하지 않으면 오류가 발생하지 않습니다.

+2

손가락이 엇갈리게 놓여 있는지 확인하십시오. –

+1

함수를 잘 이해할 수있는 프로젝트 구조를 잘 알고 있다면 isn 동적으로 참조 (즉, 런타임에 함수에 대한 심볼 탐색이 있음)하면 이것이 최선의 방법이라고 생각합니다. 그것은 내가하는 일입니다. – Omnifarious

+4

손가락을 건 드리면 프로젝트를 구축하는 데 30 분이 걸리지 않습니다. –

3

코드 커버리지 도구가 필요합니다. 이 wikipedia article에는 목록이 있습니다.

+3

왜? 테스트 코드가 존재하지 않을 수도 있습니다. – reinierpost

+1

테스트 코드가 존재하지 않습니다. 코드 적용 도구는 작동하지 않을 것입니다. 왜냐하면 우리가 모든 경우에 명중했는지 알 수 없기 때문입니다. – Joe

+0

코드 커버리지 툴은 반드시 특정 테스트 코드를 필요로하지는 않습니다 - 일부는 프로덕션 환경의 일반 코드에서 실행될 수 있습니다. –

3

우수하고 무료 인 소스 모니터 정적 분석 도구 인 http://www.campwoodsw.com/에서 메서드에 대한 호출 횟수를 알 수 있습니다. 원하는대로 생각할 수 있습니다.

편집 : 죄송합니다. 통화 통계는 사실 내가 생각한대로하지 않습니다. 그럼에도 불구하고 SM은 훌륭한 도구이므로 사람들의 관심을 끌기에 좋았습니다.

+0

소스 모니터를 시도하고 메서드에 대한 호출 통계가이 메서드가 호출 된 횟수가 아니라이 메서드가 수행하는 다른 메서드에 대한 호출 수라고 생각합니다. 내가 틀렸다면 누군가 나를 교정하십시오. – BlueTrin

+0

네, 맞습니다. 죄송합니다. 실제로 사용하는 척도는 아닙니다. –

1

코드가 간단하면 정적 분석이 효과적 일 수 있습니다. 그러나 C++은 문맥에 매우 민감합니다 : /. 그래서 저는 개인적으로이 지역에서 도구를 찾지 않으려했습니다. 적어도 CLANG이 C++과 완벽하게 호환 될 때까지는 D

단위 테스트가 필요합니다. 런타임 프로필을 생성하는 코드를 컴파일하는 Visual Studio를 얻은 다음 (스크립트 언어 사용)에서 생성 된 프로파일 응용 프로그램에서 모든 유스 케이스 (수동 또는 단위 테스트)를 다룬 경우 가장 많이 사용되지 않는 (또는 전혀 사용되지 않은) 기능을 식별 할 수 있어야합니다. 그런 다음 마커 원 안구를 사용하여 소스 기반을 트리밍 할 수 있습니다.

수동으로하지만 그 일을 어디에도 없습니다 : D

1

비주얼 스튜디오 콜 그래프를 생성 할 수 있습니다, 보여주는이 '라는 별'각 기능. Doxygen은 Visual Studio를 사용하지 않으려는 경우에도 동일한 작업을 수행합니다.

그러나이 두 가지 방법 모두 포인터를 통해 호출되는 함수를 감지하는 데 실패하지만 일반적으로 수동으로 검사하기 쉽습니다.

+0

+1 나는 항상 수동으로 확인하기가 쉽지 않을지 모르지만 함수 포인터를 불러 오려고합니다. 내가 가진 전체 개념의 유일한 문제는 가능한 제어 경로가 실제로 작성한 모듈과 관련된 숫자가 기하 급수적 일 것이기 때문에 모든 함수가 정적으로 연결되어 있지 않으면 안전성을 100 %로 제거하는 것이 불가능할 것입니다. –

+0

필자는 함수 포인터가 코드 기반 내에서 광범위하게 사용되지 않는다는 것을 기초로하여 * 정상적으로 * 쉬울 것이라고 말했습니다. 나는 노력의 관점에서 말하며, 반드시 복잡하지는 않았다. 나는 코드에 대해 어느 정도 친숙하다고 가정하고있다. 예를 들어 코드라면 코드 포인터를 사용했는지 여부와 위치를 알 수 있습니다. – Clifford

+0

충분히 좋습니다. 나는 그곳에 실제로 단어를 넣었습니다. –

1

동적으로 어떤 함수가 사용되고 있는지 알고 싶으면 (vC++) 컴파일러에서 callcap 후크를 삽입 한 다음 사용법 정보를 덤프하는 데 사용할 수 있습니다.

이것은 정적 분석 기반 접근법에 유용한 보완책입니다. 실행 중에 입력 된 모든 코드를 볼 수 있기 때문입니다 (실행이 어떻게 실행되었는지에 관계없이).

Visual Studio의 통화 프로필 후크에 대한 정보는 http://msdn.microsoft.com/en-us/library/ms254291(VS.80).aspx을 참조하십시오.

2

저는 수학적으로, 이것은 일반적인 경우에는 할 수 없다고 확신합니다. 재귀 및 함수 포인터 (또는 퍼스트 클래스 함수)를 허용하면 정지 문제에 대한 간단한 감소로 끝납니다.

부여 , 이것은 당신이 다루지 않을 경우,하지만 당신은

+0

그것이 클 리 포드의 대답에 대한 내 의견을 말하고있는 부분입니다. 당신은 대답을 게시, 당신은 포인트를 얻을 :) :) +1 –

관련 문제