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)
int main(int argc, char* argv[])
{
MACRO("Some string",
42);
return 0;
}
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 .