Gibt es eine GCC-option, um zu warnen, über das schreiben `das Feld` statt `this->Feld`?

Diesem folgenden code (mit einem bösartigen bug) kompiliert mit GCC ohne jede Vorwarnung. Aber, natürlich, es funktioniert nicht wie erwartet durch den Entwickler (mich).

#include <iostream>

struct A
{
    bool b;
    void set(bool b_) { this->b = b_; }
    bool get() const { return this-b; } //The bug is here: '-' instead of '->'
};

int main()
{
    A a;
    a.set(true);
    std::cout << a.get() << std::endl; //Print 1
    a.set(false);
    std::cout << a.get() << std::endl; //Print 1 too...
    return 0;
}

Die Warnung kann ich für den compiler (GCC-4.8) zu vermeiden, diese Art von typo?

Verlinkten Frage: gibt es eine Möglichkeit zu zwingen (oder warnen) der Zugriff auf member-Variablen/Funktionen mit this->?

  • Was ist, wenn einige seltsame Person will, abzüglich der this Zeiger durch einen booleschen Wert? Sollte er eine Verwarnung bekommen?
  • Vielleicht können Sie nicht. In einigen seltsamen Fällen wird Ihr code macht Sinn
  • Wenn Sie aktiviert haben die hypothetische Warnung option, die OP fragt, dann ja.
  • Dies ist richtig, C++ - Satz, also kein compiler erzeugt eine Warnung. Sollten Sie die Verwendung von statischen code-Analyse-tool statt.
  • meinen Sie nicht, Sie sollten? Sie könnten schalten Sie immer die Warnung, dass, wenn Sie wissen, dass ist wirklich das, was Sie tun wollen
  • Ich könnte mir vorstellen -Wconversion (implizite Konvertierung Warnungen), als Zeiger implizit in bool - aber das hat es nicht bekommen...
  • die meisten Compiler erzeugen Warnungen für "richtige" C++ - Sätze. Zumindest bei der Verwendung von expliziten Warnung Optionen.
  • Ich bin mir ziemlich sicher, dass es keine Warnung für diesen, jeden einzelnen Vorgang hier ist Recht sinnvoll in einem bestimmten Kontext.
  • Das ist die ganze Zeit in der realen Welt code, wie if(p && p->bla) würden Sie nicht warnen, dass für.
  • Ich denke, dies zeigt perfekt, warum unit-Tests Wert hat.
  • Nicht alltäglich für die Werte zurückgeben...
  • Wie über Warnung für das tun von Zeiger-Arithmetik auf this? Ich hätte nichts dagegen, eine solche option Warnung obwohl vielleicht nicht in -Wall.
  • Das würde Sinn machen in meinen Augen. Offenbar niemand sah, dass Sie als groß genug, ein Problem so weit, aber ich würde nicht dagegen, dass die Warnung entweder.
  • Vielleicht möchten Sie versuchen -Waddress (die aktiviert ist, indem Sie -Wall) und warnt davor, verdächtige Verwendungen von Speicher-Adressen. Allerdings bin ich zweifelhaft - Konvertierung von bool zu int ist gut definiert, Zeiger-Arithmetik (addition/Subtraktion, eine ganze Zahl zu/von einem pointer), und die Umwandlung von Zeiger auf bool sind auch alle Konvertierungen angegeben, die Häufig in der Praxis verwendet. Wenn so ein Konstrukt wie deins gab Warnungen, die false positives " wäre riesig, und die Warnung nur selten aktiviert werden.
  • verwenden Sie nicht this->. Das wird vermeiden das problem vollständig
  • double x,y; x == y; ist auch gültig, aber es ist eine offensichtliche Warnung für diesen Fall.
  • Nicht mit this ist manchmal nicht eine sehr gute option, wie das vererben von templates
  • Interessant, -Wpointer-arith nicht fangen.
  • Zwei weitere nicht-Echtzeit-Lösungen: wenn Sie ein tool wie Visual Assist, der Fehler ist viel schwieriger zu machen, weil es kann automatisch hinzufügen -> nach einem Zeiger. Sie können auch Ihre version control pre-commit-hooks zu stoppen Instanzen this- ohne > folgende.
  • "die meisten Compiler erzeugen Warnungen für "richtige" C++ - Sätze": ich würde so weit gehen zu sagen, dass alle Warnungen werden von "richtigen" C++ - Sätze. Wenn es nicht gültigen code, den Sie bekommen würde, sondern ein Fehler.
  • Zeiger-Arithmetik auf this sinnvoll sein können, aber umwandeln des Ergebnisses zu bool ist nicht. Clang ist -Wundefined-bool-conversion warnt impliziten Konvertierung von this zu bool, das ist immer wahr. Es könnte unter Umständen erweitert werden, um auch warnen, auf eine implizite Konvertierung von this-n zu bool, die ist auch immer wahr.
  • vorausgesetzt, das Objekt ist Teil eines Arrays und den Zugriff auf das vorhergehende, - dann gefeuert 🙂
  • Ugh, es sollte nur verboten, eine binäre Subtraktion ohne whitespace um es in den ersten Platz. @LưuVĩnhPhúc: ich weiß, dass das Häufig, aber ich halte es für eine schlechte Praxis. Es zwingt auch Sie, um den Namen der Basisklasse, wenn die Erben (wenn Sie abhängige Typen beteiligt sind), das ist ärgerlich und inkonsequent.
  • Sie haben Recht, die this-> sollten vermieden werden, wo möglich. Es gibt jedoch Fälle, wo this-> erforderlich ist (template-Vererbung), so ist es sollte angemerkt werden, dass die Orte, an denen this-> ist tatsächlich erforderlich, sind auch die Fälle, in denen eine fehlerhafte this-b ist ein Fehler (weil b ist nicht zugänglich ohne die this->). Also die Regel ist: benutzen Sie nicht this-> es sei denn, erforderlich.
  • Ich hoffe, dass die Menschen, die sich verschworen, um die Subtraktion ein boolescher Wert von einem Zeiger legal in C++ fühlen Sie sich zumindest ein wenig schuldig. Die Zeiger auf bool-Konvertierung ist nur zu verteidigen, sondern indem Sie die Subtraktion mit bools?

InformationsquelleAutor Caduchon | 2017-09-20
Schreibe einen Kommentar