2012-11-22 2 views
1

Linux에서 64 비트 레거시 응용 프로그램을 이식하는 중입니다. long과 int가 같은 의미로 사용되는 곳이 많이 있으며, 소스 코드가 상당히 크면 테스트를 통해 모든 것을 잡기가 어렵습니다. 정적으로 코드를 분석하고 안전하지 않은 코드를 수정하기 위해 플러그인을 사용할 계획입니다. 하나 개는 이러한 패턴은안전하지 않은 캐스트를 판별하는 경고

void foo(unsigned long *x){ 
    *x = *x + 1; //x is pointing to a 32-bit space 
    return; 
} 

int main(){ 
    unsigned int x = ; 
    foo(reinterpret_cast<unsigned long*>(&x)); 
} 

우리는 우리의 응용 프로그램을 구축하는 GCC-4.2.1를 사용합니다. 그리고 WALL과 -Wextra를 사용할 때조차도 이러한 유형의 캐스트에 대해 경고하지 않습니다.

나는 맹목적으로 달리기를 시도했지만 성공하지 못했습니다. clang에 위험한 명시 적 캐스트에 대해 경고하는 플래그가 있습니까? 그렇지 않다면 어떻게 추가하나요?

답변

2

나는 clang이 찾고있는 상황에 대해 직접 경고하지 않는다고 생각합니다. 그러나 C 스타일 캐스트 및/또는 reinterpret_cast<>()의 모든 용도를 감지하는 플러그인을 만드는 것은 비교적 간단합니다. 원본 트리가있는 경우 tools/clang/examples/PrintFunctionNames 디렉터리에 플러그 인을 만드는 방법에 대한 예가 있습니다. 런던 지역에있는 경우 다음 주 월요일에 my presentation에 관심이있을 수 있습니다. 간단하게 찾을 수있다 염두에 제공

+0

감사 디트 마르에 대해 당신에게 오류의 무리를 줄 것이다! 나는 참석할 수 있으면 좋겠지 만 나는 가까이에 있지 않습니다. 이 예제를 살펴보고 규칙을 추가하려고합니다. –

+0

나는 gcc -Dreinterpret_cast = static_cast myfile.cpp와 같은 것을 시도했다. 그리고 이것은 내가 필요한 오류들을 던지기 시작했다. 나는 이것이 너무 강하게 작용할 것이라고 확신한다. 나는 그 규칙을 추가 할 것이다. –

1

reinterpret_cast을 사용하여 명시 적으로 캐스팅 중이므로 컴파일러에서 사용자가 수행중인 작업을 알고 있다고 가정합니다. 그렇지 않으면 어디서나 할 수있는 모든 캐스트에 대해 경고를 받게됩니다.

2

그럼 가장 쉬운 방법은/static_cast 모든 reinterpret_cast을 교체하고 컴파일 - GCC는 무효 static_cast

+0

감사! 그것은 가능합니다. 나는 그것을 시험해 볼 것이다. –

+0

나는 gcc -Dreinterpret_cast = static_cast myfile.cpp와 같은 것을했는데, 이것은 내가 필요로하는 에러를 던지기 시작했다. –

관련 문제