2011-09-30 3 views
9

仮想メソッドをオーバーライドすると、可視性(パブリックメソッドとしてオーバーライドされた保護されたメソッド)を間違えたとき、コンパイラによって警告されません。間違った可視性を持つ仮想メソッドをオーバーライドするときに警告する方法

有効な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

OKではない間違い。質問に記載されているように、私はそれが完全に有効なC++であることを認めます。通常、それは私が欲しいものではないだけです。露出してはいけないものを公開しているからです。 – Julien

+0

ええ、それは間違いではありません。これは、たとえそれが著者の意図ではないとしても、あなたが書くことができる言語のものです。これは仮説的な "私に何か他の意味があるかどうか教えてください"という警告の1つになります。だれかが知っているのは、派生型を知っている人が関数にアクセスできるようにしたいという状況があるかもしれないが、基本型しか知りません。 –

+0

これは素晴らしい質問です。 –

答えて

0

私はctagsを使用して、私のニーズに解決策を見つけました。

CTagsはC++を解析し、情報をファイルにダンプできます。

次のオプションを使用する:

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

私は簡単に解析可能な形式で、すべての必要な情報を得ることができます。

配管$TAGFILEからいくつかのgrepコマンドを使用して、既知の関数名に予想される可視性があることを確認し、それ以外の場合は警告ファイルを発行することができます。ここで

はctagsの出力から情報を抽出するためのbashの抜粋です:

#!/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 
関連する問題