사용하지 않는 기능에 대해 경고를 받을 수 있는 방법이 있습니까?
여러 컴파일 유닛을 포함하여 코드베이스에서 사용되지 않는 함수를 찾고 싶습니다.gcc를 컴파일러로 사용하고 있습니다.
다음은 예를 제시하겠습니다.
foo.c
(적절하지 않은 경우)foo.h
):
void foo() {
....
}
void bar() {
....
}
main.c
:
#include <stdio.h>
#include "foo.h"
int main(void) {
bar();
return 0;
}
이 예에서는 다음 사항에 대해 경고하고 싶습니다.foo()
사용되지 않습니다.
이 있습니다.-Wunused-function
gcc 옵션:
-Wunused-function
정적 함수가 선언되었지만 정의되지 않았거나 인라인 이외의 정적 함수가 사용되지 않을 때마다 경고합니다.이 경고는 -Wall에 의해 유효하게 됩니다.
그러나 이는 정적 기능만을 위한 것으로 위의 예에서는 경고가 발생하지 않습니다.
이 작업을 수행할 수 있는 도구/스크립트/기타 컴파일러의 제안도 받아들입니다.다만, 계속 사용하고 싶습니다.gcc
가능하면.
LibreOffice 개발자인 Caolan Mc Namara는 LibreOffice 소스 코드에서 이러한 유형의 것을 탐지하는 작은 도구를 만들었습니다.LibreOffice에서 사용되지 않는 수천 개의 기능과 메서드가 있었습니다.그의 도구는 그것들을 제거하기 위한 핵심 요소이다.
콜캐처라고 해요.할 수 있다
정의된 함수/수집 및 호출된 함수/수집된 함수/수집된 함수/수집 제외
어셈블러 출력에서 직접 작동하므로 x86 및 x86_64 아키텍처에서만 작동합니다.이렇게 출력할 수 있습니다.gcc에 대한 기존의 컴파일 및 링크콜과 통합할 수 있습니다.
Caolan은 이 플러그인이 gcc 플러그인이 되어야 한다는 데 동의합니다.
gcc 옵션 추가-ffunction-sections
당신의 컴파일에, 그리고--gc-sections
그리고.--print-gc-sections
링크 명령으로 이동합니다.gcc를 통해 링커를 호출하는 경우-Wl,--gc-sections,--print-gc-sections
이것들을 ld에 통과시킵니다.
이렇게 하면 사용하지 않는 오브젝트 코드가 삭제됩니다.이 경우,--gc-sections
원하는 출력을 생성하면 됩니다.
사용하지 않는 데이터의 식별에 대해서는 묻지 않았습니다만, 그러기 위해서는,-fdata-sections
컴파일 옵션도 선택할 수 있습니다.
당신이 경고를 요청했고 gcc 옵션을 사용하지 않는 것을 선호한다는 것을 알지만, 그것은 매우 쉽습니다.
linker optimization(--gc-sections)을 사용하여 응용 프로그램에서 데드코드를 삭제할 수 있습니다.
gcc의 man 페이지에서:
--gc-sections --no-gc-sections 사용되지 않는 입력 섹션의 가비지 수집을 활성화합니다.이 옵션을 지원하지 않는 대상에서는 무시됩니다.명령줄에서 --no-gc-sections를 지정하여 (이 가비지 컬렉션을 수행하지 않음) 기본 동작을 복원할 수 있습니다.
--sections는 기호와 재배치를 검사하여 사용할 입력 섹션을 결정합니다.입력 기호를 포함하는 섹션과 명령줄에서 정의되지 않은 기호를 포함하는 모든 섹션이 유지되며 동적 객체가 참조하는 기호를 포함하는 섹션도 유지됩니다.공유 라이브러리를 빌드할 때 링커는 표시되는 기호가 모두 참조된다고 가정해야 합니다.이 섹션의 초기 세트가 결정되면 링커는 재배치에 의해 참조되는 모든 섹션을 사용으로 재귀적으로 마킹합니다.--entry 및 --undefined를 참조하십시오.
이 옵션은 부분 링크를 수행할 때 설정할 수 있습니다(옵션 -r과 함께 사용 가능).이 경우 보관되는 심볼의 루트는 --entry 또는 --undefined 옵션 또는 링커 스크립트의 "ENTY" 명령으로 명시적으로 지정해야 합니다.
gprof
가장 간단한 해결책이라고 생각합니다.당신이 참고 있는 샘플 프로그램을 정리했습니다.-pg
옵션을 선택해서gmon.out
달릴 때a.out
(나중에 gprof에서 사용할 수 있는 것) 그리고 마침내gprof -z a.out gmon.out | tee output.txt
당신의 기능을 찾을 수 있었습니다.foo
사용되지 않은 목록에! 즉, 호출됨0
시대.-z
와 함께 사용해야 하는 옵션입니다.gprof
사용하지 않는 루틴을 추적합니다.
적절한 포인터를 얻을 수 있는 스레드 덕분입니다.
PS:gprof
사용하지 않는 기능과 함께 사용하지 않는 라이브러리 함수의 많은 다른 기능을 토해냈습니다.foo
이거 필터 어떻게 해야 될지 정말 모르겠어:)
첫 번째로, 이러한 경고를 프로그램 전체에 적용하려면-flto
플래그는 각 유닛의 컴파일 시점이 아닌 링크 시에 해결되어야 하기 때문에 플래그를 지정합니다.하지만 GCC는 이런 식으로도 그런 경고를 하지 않는다고 생각합니다.
그러면 일반적인 경우, 나는 그것을 제공하는 것이 현명하지 않다는 것을 이해한다(예를 들어 링크되어 있기 때문에).libc
어플리케이션에는 필요 없는 기능이 많이 포함되어 있을 것입니다.또한 응용 프로그램은 다음을 사용할 수 있습니다.dlsym
분명 비길 데 없는 기능에 도달하기 위한 요령...
단, 이것은 GCC 플러그인 또는 MELT 확장의 잠재적인 사용 사례의 좋은 예입니다.각 콜을 어딘가에 등록하고 나중에 호출되지 않은 모든 함수를 검색하는 유틸리티입니다(다만, GCC의 플러그인 또는 MELT 확장을 코딩하려면 적어도 며칠이 걸립니다.이는 GCC의 내부 기능을 이해할 필요가 있기 때문입니다).
프로파일링 기술을 사용하여 동적으로 사용되지 않는(호출되지 않음) 함수를 가져올 수도 있습니다.
부담없이 메일로 문의해 주세요.
Eclipse CDT에는 코드 분석이 있어 사용하지 않는 정적 함수와 사용하지 않는 함수 선언을 마킹하도록 설정할 수 있습니다.이미 말한 것처럼 링커만이 특정 (비정적) 함수가 특정 바이너리에서는 사용되지 않았음을 알 수 있었습니다.
언급URL : https://stackoverflow.com/questions/9091397/is-there-a-way-to-get-warned-about-unused-functions
'programing' 카테고리의 다른 글
Gradle - 툴체인을 사용한 플랫폼 'JDK 7 (1.7)'을 타깃으로 하지 못했습니다. (0) | 2022.08.14 |
---|---|
정적 변수는 C 및 C++ 어디에 저장됩니까? (0) | 2022.08.14 |
실행 시 하나의 Java 클래스가 다른 클래스를 확장하는지 테스트하려면 어떻게 해야 합니까? (0) | 2022.08.14 |
onSnapshot에서 검출되지 않은 오류: 오류: signOut()에 대한 권한이 없거나 부족합니다. (0) | 2022.08.14 |
왜 Java의 Iterator는 반복가능하지 않은가? (0) | 2022.08.14 |