wake-up-neo.com

Sollte es eine Diagnose vom GCC-Compiler für diesen fehlerhaften C++ - Code geben, der das Attribut [[fallthrough]] enthält?

Ich habe C++ 17-Funktionen auf GCC-Compiler-Version 7.1.0 getestet. Dies hängt mit dem Attribut fallthrough zusammen und das folgende Beispiel ( Live-Beispiel ) wurde aus der Online-CPP-Referenz hier angepasst.

#include "iostream"
using namespace std;

int f(int n) {

  switch (n) {
    case 1:
    case 2:
      n = n + 20;
     [[fallthrough]];
    case 3: // no warning on fallthrough      
      n = n + 30;
    case 4: // compiler may warn on fallthrough      
      [[fallthrough]]; // ill­formed, not before a case label
      //n = n + 40;  //commented out to test if compiler will warn.
  }
  return n;
}    

int main()
{
    cout << f(1) << endl;
    cout << f(2) << endl;
    cout << f(3) << endl;
    cout << f(4) << endl;
    return 0;
}

Der letzte [[fallthrough]] (für case 4:) ist falsch geformt.

Die Frage zu "Was muss der C++ - Compiler mit schlecht geformten Programmen nach dem Standard tun?" hier hat die top antwort besagt dass:

Um es zusammenzufassen: Wenn ein schlecht geformtes Programm eine diagnostizierbare Verletzung enthält, für die der Standard nicht explizit "keine Diagnose erforderlich" spezifiziert, sollten konforme Implementierungen eine Diagnose ausgeben .

Daher habe ich den Standard (N4713) nachgeschlagen, um festzustellen, ob für dieses Problem keine Diagnose erforderlich ist. Ich konnte keine solche Aussage finden.

Interessanterweise nach all dem, als ich die folgende Aussage nach dem letzten [[fallthrough]] hinzufügte

n = n + 40;

der Compiler warnt ( Live-Beispiel ):

warnung: Das Attribut 'Fallthrough' steht nicht vor einer Fallbezeichnung oder einer Standardbezeichnung

Also, zwei Fragen hier:

  1. Hat der Compiler eine Diagnose verpasst oder fehlt hier etwas?
  2. Wenn es sich um ein Compilerproblem handelt, ist es ernst genug, um gemeldet zu werden?
12
P.W
  1. Wenn es sich um ein Compiler-Problem handelt, ist dies ernst genug, um gemeldet zu werden?

Ja, Konformitätsfehler sind wichtige Fehler. Entwickler verlassen sich auf Compiler, die dem Standard entsprechen (der Compiler hat möglicherweise Modi, die keine strikte Konformität erfordern. Gcc erfordert jedoch -pedantic, um alle vom Standard geforderten Diagnosen zu erhalten ) Welche Priorität hat a Bug Gets ist eine andere Geschichte, aber nur das Dokumentieren des Bugs und das Erkennen des Compilerteams als Fehler, kann zukünftigen Entwicklern, die in den Fehler stoßen, eine große Hilfe sein.

  1. Hat der Compiler das Ausgeben einer Diagnose verpasst, oder fehlt mir hier etwas? 

Ja, das ist schlecht formuliert nach [dcl.attr.fallthrough #] p1 :

... Die nächste Anweisung, die nach einer Fallthrough-Anweisung ausgeführt wird, ist eine Anweisung mit Label, deren Bezeichnung eine Fallbezeichnung oder eine Standardbezeichnung für dieselbe Switch-Anweisung ist. Das Programm ist fehlerhaft, wenn keine solche Anweisung vorliegt.

und der Compiler muss mindestens eine Diagnose gemäß [intro.compliance] p2.2 ausgeben:

Wenn ein Programm einen Verstoß gegen eine diagnostizierbare Regel oder ein Vorkommen eines in Beschriebenen Konstrukts enthält, wird dieses Dokument als „bedingt unterstützt“ beschrieben, wenn die Implementierung dieses Konstrukt nicht unterstützt. eine Konformität Die Implementierung muss mindestens eine Diagnosemeldung ausgeben.

9
Shafik Yaghmour

Irgendwann nachdem ich diese Frage gepostet hatte, wurde basierend auf der Frage ein Fehler gemeldet.
Ich wartete darauf, ob es akzeptiert würde. Es war akzeptiert und zugewiesen, und basierend auf diesem Kommentar im Fehlerbericht wurde ein Patch wird generiert. Das beantwortet also beide meine Fragen. 

Ich werde jedoch die Antwort von @ShafikYaghmour akzeptieren, da sie wichtige Punkte enthält, die meine Fragen beantworten.

3
P.W