Pointer checks



  • Hallo zusammen,

    mich würde mal eure Meinun zu Pointer checks auf private Member innerhalb eurer Klasse interessieren.

    Hintergrund der Frage ist folgende.

    Ich habe eine Klasse mit einer init Funktion, die nach dem erstellen des Objektes aufgerufen werden muss.
    Gibt die init funktion false zurück, konnte das objekt nicht richtig initialisiert werden und interne Klassenmember (pointer) sind ggf. NULL.

    Geht man nun davon aus, dass die Klasse richtig verwendet wird und lässt auf diese member nun vor dem Zugriff die pointer checks weg, dann bringt natürlich ein tool zur statischen codeanalyse an diesen stellen Fehler.

    Die Wahl die man nun hat ist, an diesen Stellen die Warings der code analyse punktuell abzuschalten oder doch überall pointer checks zu machen.

    Wie denkt ihr darüber?



  • Wenn ein Objekt nicht richtig initialisiert werden kann, sollte der Konstruktor eine Exception werfen.



  • Hängt davon ab, ob das Initialisieren fehlschlagen darf oder nicht. Wenn der Fehlschlag normales Verhalten ist würde ich, wie manni666 schon vorgeschlagen, eine Exception werfen. Wenn das Initialisieren nicht fehlschlagen sondern nur vergessen werden kann würde ich assertions benutzen.



  • Gibt es einen guten Grund fuer eine init Funktion? Eigentlich ist dazu der Konstruktor da. Der Konstruktor initialisiert ein Objekt, so dass es in einem gueltigen Zustand ist. Ausserdem kann dann das Initialisieren nicht vergessen gehen.



  • icarus2 schrieb:

    Gibt es einen guten Grund fuer eine init Funktion? Eigentlich ist dazu der Konstruktor da. Der Konstruktor initialisiert ein Objekt, so dass es in einem gueltigen Zustand ist. Ausserdem kann dann das Initialisieren nicht vergessen gehen.

    Der code läuft auf einem embedded system und die vorgabe ist keine exceptions zu nutzen.

    Ok, lösen wir das thema von der init methode und verwenden am beispiel exceptions.

    Wie sieht es dann mit den checks aus?



  • #include <iostream>
    #include <memory>
    
    class X {
    public:
      const std::unique_ptr<int> i;
      X() : i( std::make_unique<int>( 2 ) ) {};
    
    };
    
    int main() 
    {
      X x;
    
      *x.i = 2;
    
      std::cout << *x.i << "\n";
    }
    

    Wenn ich nichts übersehen habe, kann hier der Pointer nie 0 sein. Wenn das Analysetool das nicht erkennt (bzw. meinen Denkfehler findet) könnte man es hier abschalten.



  • #include <stdexcept>
    
    class MyClass
    {
       ...
    private:
       /*bool*/ void init()
       {
          ...
          if( ... )
          {
             throw std::runtime_error( "MyClass::init failed: reason" );
          }
       }
    };
    

    Musste dann nur noch fangen und behandeln.



  • DocShoe schrieb:

    Musste dann nur noch fangen und behandeln.

    Die Frage war nicht, wie verwende ich exceptions in der init Methode. Wie ich exceptions verwende ist mit bekannt.

    Es geht vielmehr um das Dilemma wenn pointer theoretisch nicht NULL sein können und man deswegen keine checks einbaut aber dadurch codeanalyse tools "Fehler" finden.

    Angenommen codeanalyse ist Pflicht und ihr dürft keine Fehler haben.

    Die Frage die sich stellt ist,würdet ihr (sinnlose) ptr checks einbauen oder schaltet ihr selektiv(nicht global) an den Stellen die warnungen des analyse tools ab?



  • Sascha schrieb:

    Die Frage die sich stellt ist,würdet ihr (sinnlose) ptr checks einbauen oder schaltet ihr selektiv(nicht global) an den Stellen die warnungen des analyse tools ab?

    Ja, selektiv abschalten.



  • Die Frage die sich stellt ist,würdet ihr (sinnlose) ptr checks einbauen oder schaltet ihr selektiv(nicht global) an den Stellen die warnungen des analyse tools ab?

    Es wäre absurd, sinnlosen Code zu schreiben nur um ein fehlerhaftes Analysetool zufriedenzustellen. Sollte das Analysetool aber Recht haben und es tatsächlich möglich ist, dass eine Nullpointer-Dereferenzierung stattfindet, dann liegt der Fehler in deinem Programm und du musst ihn dort beheben.



  • Sascha schrieb:

    DocShoe schrieb:

    Musste dann nur noch fangen und behandeln.

    Die Frage war nicht, wie verwende ich exceptions in der init Methode. Wie ich exceptions verwende ist mit bekannt.

    🙄
    Manchmal lese ich wohl nur das, was ich lesen möchte...



  • Mir ist nicht ganz klar wieso ein Codeanalysetool da Fehler melden sollte.
    Diese Tools melden ja auch keine Fehler wenn man ne Funktion hat die nen Zeiger-Parameter dereferenziert ohne ihn vorher zu prüfen. Narrow Contract ist ja OK.

    Fehler sollten da nur gemeldet werden wenn dein Programm auch wirklich Code-Pfade enthält über die so eine Nullpointer-Dereferenzierung passieren könnte.


Anmelden zum Antworten