Warum hat nicht der compiler warnen, über eine leere if-Anweisung?
Ich bin mit Keil µvision v4.74 und aktiviert die option "Alle Warnungen".
Schrieb ich Folgendes absichtlich code:
if(condition matched)
{
//do something
}
Wenn ich baute mein Projekt, ich habe 0 Fehler, 0 Warnungen.
Allerdings, wenn ich versehentlich schrieb:
if(condition matched);
{
//do something
}
Bekam ich auch 0 Fehler, 0 Warnungen.
Es unmöglich war für mich zu erfahren, dass eine kleine ;
folgenden die if-Bedingung war die Wurzel des Problems.
Nicht warum der compiler behandeln Sie es als eine Warnung und informiert mich?
- Warum sollte er auch? Das ist ein sehr gut gebildet und rechtliche Hinweise. Nichts warnable hier.
- Wenn ich eine variable deklarieren und verwenden Sie es nicht, wird er sagen, "variable deklariert, aber nicht definiert". Sollte er etwas sagen wie "wenn-Anweisung verwendet, aber keinen Körper, der für die if-Anweisung?"
- Eine Sache möchte ich hier erwähnen. Dies ist überhaupt nicht im Zusammenhang mit
keil
.. im Allgemeinen die Programmierung auch wird es geschehen. - ich es markiert zu keil, weil ich erwartet, dass jemand von keil können in der Lage sein zu sagen, warum oder erwägen, dies zu verbessern Ihre IDE. Ich möchte nicht, dass jemand mit Keil zu gehen durch das gleiche problem, ich ging durch. gcc wirft eine Warnung, wie gesagt, von @Matteo
- Der compiler ausgeben sollte eine und nur eine Warnung, "Sie sind mit c, nicht erwarten, eine Sicherheit Netz".
- Ich bin damit einverstanden, ich kann mir nicht vorstellen, dass es eine legitime Grund für die Erklärung einer
if
- Anweisung ohne einen Körper. Scheint, wie es sollte warnen, standardmäßig, ohne Sie zu Fragen, die compiler für zusätzliche Warnungen. - im Gegenteil, gegeben, dass die Laufzeit komplett ohne Sicherheitsnetze aus performance-Gründen, dass Sie alle möglichen statische Analyse zur compile-Zeit ist äußerst wünschenswert.
- dann nicht user C oder C++! Modul 2 wäre eine viel bessere option, wenn Sie sich sorgen über die Sicherheit.
- Aber... das ist genau das, was Warnhinweise sind. Wenn es nicht gut gebildet und legal, es wäre ein Fehler. Warnungen werden für Dinge, die legal sind, aber misstrauisch, als wahrscheinlich ein Logik-Fehler.
- Bedenken Sie, dass viele makro-suites erstellen einer solchen situation rechts und Links, wie bits von code "auskommentiert" ist oder nicht, basierend auf global-macro-variable Einstellungen.
- Das klingt interessant für mich, weil ich kann nicht denken Sie an einen Fall, wo es würde nicht gerade so viel, um entweder 1) "kommentieren" die
if
block oder 2) invertieren der bedingten und machen die Aussage, dass bekommt "auskommentiert" einelse
block oder etwas ähnliches. Also, die situation scheint völlig vermeidbar, aber ich bin kein C-Experte, vielleicht gibt es nur Dinge, die ich denke nicht. - Betrachten Sie, wenn ich
if (a) some_dump_macro;
. Wenn ein globales flag irgendwo schaltetsome_dump_macro
dann habe ich am Ende mitif (a);
. - weil keil-compiler ist nicht sehr user-freundlich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht ein Fehler, da eine leere Anweisung ist eine gültige Anweisung; jedoch, da es sicherlich verdächtigen code es ist der perfekte Kandidat für eine compiler-Warnung - und in der Tat
gcc -Wall -Wextra
warnt nicht vor über dieses:https://godbolt.org/g/RG1o7t
beide
clang
und VC++ es auch tun.gcc-6 ist noch schlauer (naja, vielleicht zu viel), und nimmt sogar den Einzug als Hinweis, dass etwas falsch ist:
So, entweder Sie haben nicht die Warnungen aufgedreht genug, oder dein compiler ist nicht schlau genug.
Wenn Sie nicht die Möglichkeit haben zu wechseln, um eine weitere hilfreiche compiler sollten Sie verwenden tools zur statischen Analyse; zum Beispiel, in diesem Fall
cppcheck
spots der Fehler (wenn Sie angesichts der--enable=all --inconclusive
flags):Nachtrag - relevante Warnungen für verschiedene Compiler (fühlen Sie sich frei, zu aktualisieren)
zur Erinnerung, der entsprechenden Warnung Optionen sind:
-Wempty-body
; in-Wextra
;-Wmisleading-indentation
helfen können; in-Wall
;-Wempty-body
; in-Wextra
zu;/W3
Statische Analyse-tools:
--enable=warning --inconclusive
; in--enable=all --inconclusive
gcc
sind, so können Sie ihm einen Versuch geben (vielleicht nicht in der Produktion, sondern nur von Zeit zu Zeit, um einen Blick auf ein anderes set von compiler-Diagnostik). Aber nochmal, ich bin kein Keil/armgcc Experte, also ich weiß nicht, ob verwendet werden können, meist als drop-in Ersatz oder wenn es geht ein Albtraum zum Umschalten zwischen den Compilern.warning C4390: ';': empty controlled statement found; is this the intent?
. Es ist eigentlich eine level 3 Warnung, so dass Sie gar nicht brauchen /W4. Die Standard-Warnung Niveau fangen diese ein.clang
erzeugen würde diese Warnung?gcc
, d.h.-Wempty-body
.Als Matteo Antwort angegeben, der code ist absolut gültig.
Es wird interpretiert auf diese Weise:
Es ist ein bisschen eine Formsache, aber die Bedingungen mit leeren Körper zu tun haben, einige sehr schöne verwendet.
Flusen und andere solche code sanity-tools warnen vor der unerwarteten änderung in der Einrückung, und fangen Sie zusätzliche Fehler, die möglicherweise stilistische obwohl technisch nicht compiler-Fehler.
- Oder security-Problemen behaftete variable, Puffer-management, Potenzial-Wartung Probleme wie schlechte Würfe, etc. Es gibt eine Menge von code-Probleme fallen nicht in die Kategorie der "compiler-Fehler".
Als @jpmc26 erwähnt, kann dieser Ansatz besser, da Sie nicht haben, um Compiler-Schalter zu verwenden. Obwohl ich auch persönlich Wert darauf, die Fähigkeit zu laufen die beiden unabhängig voneinander.