2011-09-30 9 views
9

Quando si ignora un metodo virtuale, ho notato che quando commetto un errore nella visibilità (metodo protetto sovrascritto come metodo pubblico), non sono avvisato dal compilatore .Come essere avvisati quando si esegue l'override di un metodo virtuale con visibilità errata

È valido C++, ma in genere è un errore.

Ad esempio:

#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(); 
} 

la compilazione con gcc e clang, con -Wall -Wextra, senza fortuna. Ho eseguito CppCheck su questo codice, ancora senza fortuna.

Quale strumento può aiutarmi a rilevare questo? Ho bisogno di sistemare tutte le fonti di una libreria su cui sto lavorando.

+0

Ok non è un errore. Come affermato nella domanda, riconosco che è perfettamente valido C++. Di solito, non è quello che voglio, perché sto esponendo qualcosa che non dovrebbe essere esposto. – Julien

+0

Sì, non è un errore. È semplicemente qualcosa che il linguaggio ti permette di scrivere, anche se questo potrebbe non essere l'intenzione dell'autore. Questo sarebbe uno di quegli ipotetici "dimmi se intendessi qualcos'altro" avvertimenti, suppongo. Chissà, forse ci sono situazioni in cui si desidera una funzione accessibile a qualcuno che conosce il tipo derivato, ma non a chiunque conosca solo il tipo di base. –

+0

Questa è una domanda eccellente. –

risposta

0

ho trovato una soluzione alle mie esigenze utilizzando ctags.

CTags può analizzare C++ e inviare informazioni su un file.

utilizzando le seguenti opzioni:

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

posso ottenere tutte le informazioni necessarie in un formato facile da interpretare.

Connessioni $TAGFILE tramite alcuni comandi grep, è possibile verificare che un nome di funzione noto abbia la visibilità prevista ed emettere un avviso con il file compromesso in caso contrario.

Ecco un frammento bash per estrarre informazioni dal uscita ctags:

#!/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 
Problemi correlati