2011-09-30 6 views
9

가상 메서드를 재정의 할 때 공개 옵션 (public 메서드로 재정의 된 보호 된 메서드)에서 실수를하면 컴파일러에서 경고하지 않는다는 것을 알았습니다 .잘못된 방법으로 가상 메서드를 재정의 할 때 경고 방법

유효한 C++이지만 대개 실수입니다. 예를 들어

는 :

#include <iostream> 

class Base 
{ 
protected: 
    virtual void ProtectedMethod(void) 
    { 
    std::cout << "Base::ProtectedMethod" << std::endl; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void ProtectedMethod(void) 
    { 
    std::cout << "Derived::ProtectedMethod" << std::endl; 
    } 
}; 

int main(int, char* []) 
{ 
    Derived d; 
    d.ProtectedMethod(); 
} 

나는 행운과 함께, -Wall -Wextra로, GCC와 그 소리 컴파일했습니다. 이 코드에서 CppCheck를 실행했지만 여전히 운이 없습니다.

어떤 도구가이를 감지하는 데 도움이 될 수 있습니까? 내가 작업중인 라이브러리의 전체 소스를 수정해야합니다.

+0

확인되지 실수 : 여기

는 ctags를 출력에서 ​​정보를 추출하는 떠들썩한 조각입니다. 질문에서 언급했듯이, 나는 그것이 C++ 완벽하게 유효하다는 것을 인정한다. 일반적으로 노출되지 않아야하는 것을 노출하고 있기 때문에 원하는 것은 아닙니다. – Julien

+0

그래, 그건 실수가 아니야. 이것은 저작자의 의도가 아니더라도 단순히 언어로 작성할 수있는 것입니다. 이것은 가상의 "내가 다른 것을 의미하는지 알려주십시오"라는 경고 중 하나입니다. 누가 파생 된 유형을 아는 사람에게 액세스 할 수있는 기능을 원하지만 기본 유형 만 알고있는 사람에게는 기능이 필요하지 않은 상황이 있을지 모릅니다. –

+0

이것은 훌륭한 질문입니다. –

답변

0

내가 ctags를 사용하여 내 요구에 대한 해결책을 발견했다.

CTags는 C++를 구문 분석하고 정보를 파일에 덤프 할 수 있습니다.

다음 옵션을 사용하여 :

$CTAGS -f $TAGFILE --fields=fkstia --c++-kinds=+p -R $SOURCES 

나는 쉽게 구문 분석 형식으로 필요한 모든 정보를 얻을 수 있습니다.

명령을 통해 $TAGFILE 파이프를 연결하면 알려진 기능 이름에 예상되는 가시성이 있는지 확인할 수 있으며, 그렇지 않은 경우에는 경고 메시지를 발행 할 수 있습니다.

#!/bin/bash 
function check_method { 
    echo "Checking $1 (should be $2 and is not)" 
    cat $TAGFILE | grep "^$1 " | grep "access" | grep -v "access:$2" | cut -f 2 
    echo 
} 

# will warn anytime a method called ProtectedMethod is not protected 
check_method ProtectedMethod protected 
관련 문제