Fehler mit der Direktive #line im Visual C ++ - Compiler

image1.png

Die Direktive #line wird vom PrĂ€prozessor hinzugefĂŒgt und kann dann verwendet werden, um zu verstehen, zu welcher Datei und Zeile ein bestimmter Code in der vorverarbeiteten Datei gehört. Die Direktive #line weist Code-Tools an, die interne gespeicherte Zeilennummer und den Namen der Compilerdatei in die angegebene Zeilennummer zu Ă€ndern. Die folgenden Zeilen zĂ€hlen bereits relativ zur angegebenen Position. Die explizite Vorverarbeitung wird hauptsĂ€chlich zum Debuggen oder von verschiedenen Generatoren verwendet. In jedem Fall kann ein Fehler in einer solchen FunktionalitĂ€t zu verschiedenen negativen Konsequenzen fĂŒhren. Eines dieser Probleme trat beim Benutzer von PVS-Studio in Visual Studio 2019 auf.

Fehlerhistorie und Beschreibung


Die Direktive #line ist ein wichtiger Bestandteil der vorverarbeiteten Dateien, die vom PVS-Studio-AnalysegerÀt verwendet werden, um Warnungen in den erforderlichen Zeilen des Benutzercodes auszugeben. Hier beginnt die Geschichte der Fehlersuche.

Einer unserer Benutzer mit einer großen Codebasis begann mit der Übersetzung des gesamten Projekts von Platform Toolset Version v141 auf v142 in Visual Studio 2019. Danach traten in den Ergebnissen der Analyse zahlreiche V002-Warnungen auf und mehrere zehn andere Warnungen wurden an die falschen Codezeilen ausgegeben (ein Zeilenfehler) )

Diagnose V002 erkennt nur solche Situationen (falsche Zeilennummerierung). Dies tritt normalerweise aufgrund von mehrzeiligen Makros oder anderen PrÀprozessoranweisungen (z. B. #pragma) auf. Das Problem tritt nicht sehr hÀufig auf, sondern hauptsÀchlich auf einem Compiler von Microsoft. Eine solche Zunahme von Problemen bei einem Projekt war unerwartet, weil Unser Testsystem zeigte kein so schwerwiegendes Problem an, und wir begannen, den Analysator in der vorverarbeiteten Benutzerdatei zu debuggen.

Nach einigen Stunden des Debuggens stellten wir fest, dass der Analysator bereits mit falschen Daten zu Codezeilen arbeitete und ein Testbeispiel erstellen konnte:

#define MACRO(a, b)              // line1
                                 // line2
int main(int argc, char* argv[]) // line3
{                                // line4
    MACRO("Some string",         // line5
        42);                     // line6
    return 0;                    // line7 <=
}

Die vorverarbeitete Datei lautet wie folgt:

#line 1 "D:\\_Tests\\TestApp\\Project2\\rnd_bs.cpp"


int main(int argc, char* argv[])
{
  ;
#line 8 "D:\\_Tests\\TestApp\\Project2\\rnd_bs.cpp"
  return 0;
}

Die return-Anweisung befindet sich in der Quellzeile in der 7. Zeile, und der PrÀprozessor zeigt auf die 8. Zeile. Dieser Fehler trat im PrÀprozessor auf, vermutlich aufgrund eines mehrzeiligen Makros.

Freigegebene Version Release


Zum Zeitpunkt des Schreibens war das Problem fĂŒr die neuesten Versionen von Visual Studio bis zur Version 16.4.3 (vom 14. Januar 2020) relevant. Wir haben den Fehlerbericht " UngĂŒltige # line-Direktive nach Vorverarbeitung (VS2019, v142) " geöffnet und nach 4 Tagen eine interessante Antwort erhalten:

Dieses Problem wurde als Duplikat eines zuvor gemeldeten Feedbacks identifiziert, das hier verlinkt ist: Developercommunity.visualstudio.com/content/problem /738407/preprocessor-generates-incorrect-line-information.html . Wenn Sie hier gemeldet oder abgestimmt haben, wurde Ihre Stimme auf die ursprĂŒngliche Ausgabe angewendet. Alle anderen können ihre Stimme direkt ĂŒber das oben verlinkte Feedback abgeben. Durch Abstimmungen wird die PrioritĂ€t des Problems erhöht, indem die Auswirkungen auf die Kunden unter einem Feedback zusammengefasst werden. Vielen Dank!

Es stellt sich heraus, dass dieses Problem bereits gemeldet wurde, und am 18. September 2019 - vor fast einem halben Jahr: " PrÀprozessor generiert falsche Leitungsinformationen ". Der Benutzer hat Àhnliche Codebeispiele bereitgestellt, um den Fehler zu reproduzieren. Nach Angaben des Autors liegt der Fehler zumindest bei Visual Studio 2019 16.2 vor.

Es ist nicht bekannt, ob dies ein Zufall ist oder nicht, aber nach einigen Tagen unserer AktivitÀt wurde dem Fehler der Status Fixed - Pending Release zugewiesen .

Am 19. Mai 2020 wurde eine ĂŒberarbeitete Version von Visual Studio 2019 16.6.0 veröffentlicht. Wir empfehlen allen Benutzern von PVS-Studio, dorthin zu wechseln.


Wenn Sie diesen Artikel einem englischsprachigen Publikum zugĂ€nglich machen möchten, verwenden Sie bitte den Link zur Übersetzung: Svyatoslav Razmyslov. Ein Fehler, der durch die # line-Direktive im Visual C ++ - Compiler verursacht wurde .

All Articles