3

Xcode 6.4 (6E35b)에서 clang 정적 분석을 사용하고 잠재적 인 메모리 누수에 대해 거짓 경고를 표시합니다. 나는 문제의 메모리를 명시 적으로 해제하지만 다른 컴파일 유닛에서는 해제가 발생합니다. 다음은 내 MWE입니다.clang false positive 누출 경고를 표시하지 않으려 고 시도했습니다.

file2.c : 실제 해제를 수행합니다.

#include <stdlib.h> 
void my_free(const void* p) { 
    free((void*) p); 
} 

file1.c : 메모리를 할당하고 명시 적으로 외부 함수를 통해 해제합니다.

#include <stdlib.h> 
void my_free(const void* p); 

int main(int argc, char* argv[]) { 
    void* data = malloc(1); 
    if(data) my_free(data); 
    return 0; /* <-- "Potential leak of memory pointed to by 'data'" */ 
} 

나는 그것의 호출과 같은 컴파일 단위에 my_free()을 정의

는 경고가 생성되지 않고, 물론 나는 다른 소스 파일의 큰 숫자에서 my_free()를 호출해야합니다.

나는 FAQ and How to Deal with Common False Positives을 통해 읽었지만, 내 상황을 해결하지 못했습니다. 문제의 기억을 정말로 풀어주고있는 clang을 보장하기 위해 무엇을 할 수 있습니까?

는 경우 버전 정보는 관련 :

#ifdef __clang_analyzer__ 
#define my_free free 
#endif 

이것은을 만들 것입니다 : 그 문제를 해결하는

% clang --version 
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) 
+0

"my_free"가 "my_malloc"과 쌍을 이루기를 기대합니다. – Groo

+0

@Groo : 좋은 지적입니다. 이 MWE는 제안에서 약간 오도 된 것일 수 있지만 할당 및 할당 해제가 일반적으로 쌍으로 이루어져야한다는 데 동의합니다. –

답변

3

한 가지 방법은 헤더 파일에 분석기에 대한 특정 코드를 추가하는 것입니다 정적 분석기는 당신이 고전적인 free 기능을 사용하고 있다고 생각하고 불평을 중지한다고 생각합니다.

+0

잘 알고 있기 좋습니다. +1 – LPs

+0

멋진 솔루션입니다. 문맥에서 나는 일을 조금 다르게해야하거나 컴파일러가'my_free()'함수를 정의하려고 할 때 불평하지만 원칙이 성립한다. 고맙습니다. –