Textübertragung von CppCast 298:SonarSource-Analysetools

Textübertragung von CppCast 298:SonarSource-Analysetools

Folge 298 von CppCast wurde am 5. Mai 2021 aufgezeichnet. In dieser Folge werden Rob Irving und Jason Turner von Loïc Joly begleitet, der über die statischen Analysetools von SonarSource spricht. Außerdem diskutieren sie Visual Studio 2019 STL, GCC 11.1-Updates und Umfrageergebnisse von Meeting C++.

Diese Folge wird von einem C++ Builder gesponsert, einer C++ IDE mit vollem Funktionsumfang zum Erstellen von Windows-Apps. Die Idee der Wahl, Windows-Anwendungen fünfmal schneller zu erstellen und gleichzeitig weniger Code zu schreiben. Es unterstützt Sie während des gesamten Entwicklungslebenszyklus, um eine einzige Quellcodebasis bereitzustellen. Mit einem verbesserten Clang-basierten Compiler, Dinkum oder STL und Paketen wie Boost und SDL 2 im Paket-Manager von C++ Builder und vielen mehr. Integrieren Sie schnell kontinuierliche Build-Konfigurationen mit MSBuild-, CMake- und Ninja-Support, entweder als Einzelentwickler oder als Teil eines Teams. Dank fast 20 Datenbanken wie MariaDB, Oracle, SQL Server, Postgres und mehr mit Firedocs Highspeed-Direktzugriff. Der Schlüsselwert sind die Frameworks von C++ Builder, leistungsstarke Bibliotheken, die mehr leisten als andere C++-Tools. Dazu gehören das preisgekrönte VCL-Framework für leistungsstarke native Windows-Apps und das leistungsstarke FireMonkey-Framework für plattformübergreifendes iOS. Testen Sie die neueste Version unter embarcadero.com.

Einführung

Rob: Willkommen zu Folge 298 von CppCast! Heute gesellt sich Loïc Joly zu uns, ein C++-Programmierer, Sprecher, Lehrer und Experte. Er vertritt Frankreich im ISO C++ Standardisierungskomitee und ist auch Mitglied des Komitees, das die nächste Version des MISRA C++ Standards für sicherheitskritische Systeme entwirft. Neben der Entwicklung in C++ hat er ein besonderes Interesse daran, es zu unterrichten und bewährte Verfahren in der Community zu verbreiten. Er ist ein häufiger Redner bei Meetups und Konferenzen und unterrichtet bei Telecom SudParis. Seit er 2018 zu SonarSource kam, hat er an der statischen Analyse für C++ gearbeitet, wobei er sowohl Regeln spezifiziert hat, um anderen Entwicklern zu helfen, als auch Spaß daran hat, sie zu implementieren.

VS 2019 STL ist C++20 Feature Complete

Rob: In diesem ersten geht es also um die Vorschauversion von Visual Studio 2019 16.10, die meiner Meinung nach jetzt erhältlich ist. Dies ist ihr Änderungsprotokoll, das ankündigt, dass die STL die C++20-Funktion vollständig sein wird, was ziemlich aufregend ist.

Jason: Und hier gibt es ein ironisches Problem. Es gibt im Grunde einen Fehler im std::format wobei sich ein Teil versehentlich auf stützt . Std::format soll sein unabhängig. Sie wollen das theoretisch als echte schnelle Lösung auf C++20 ändern. Aber Microsoft hat bereits ABI-Kompatibilität mit ihrer Standardbibliotheksimplementierung versprochen. Wenn sie das also im standardmäßigen Visual Studio beheben würden, können sie es nicht beheben und würden immer noch bei hängen bleiben Abhängigkeit.

Loïc Joly: Für mich ist es ein bisschen seltsam, sich auf die vollständige Bibliotheksunterstützung zu konzentrieren. Was für mich wirklich zählt, ist die volle Supportzeit. Aber ich weiß, es ist ein guter Schritt da hinein. Ich bin begeistert.

Jason: Nun, sie sind ziemlich nah dran.

GCC 11.1 veröffentlicht

Rob: Nun, andere Neuigkeiten, die wir haben, sind ein Update für GCC 11.1.

Rob: Es wird veröffentlicht und sie kündigen auch eine Menge großartiger Unterstützung für C++20 an. Sie ändern ihre Standardsprachversion auf C++17, was großartig ist. Haben sie genau angegeben, wie weit sie mit 20 sind, oder sagen sie nur, dass sie gute Fortschritte machen?

Jason: Ich ging zur Cpp-Referenz, um mir ihre Version des Compiler-Support-Diagramms für C++20 GCC anzusehen. Sie sagten, dass sie sich auf jedes einzelne Sprachfeature mit Ausnahme von Modulen einigen. Was interessant ist, weil Clang die Tendenz hatte, in diesen Dingen die Nase vorn zu haben. Aber wenn Sie sich jetzt diese Vergleichstabelle ansehen, sind GCC und Visual Studio Clang für die Unterstützung von C++20 weit voraus.

Loïc Joly: Ich habe diese Muster bemerkt. Ich mache mir sogar ein bisschen Sorgen darüber, weil es das als eine Art Verlangsamung in Clang zu zeigen scheint. Früher war es das erste für Sprachfunktionen. Ich habe mich bei meiner täglichen Arbeit wirklich auf Clang verlassen.

Clang ist ein wunderbares Tool, aber die Tatsache, dass sie hinter Visual Studio und hinter GCC zurückbleiben, ist kein gutes Zeichen. Im Moment sehe ich zum Beispiel für Module überhaupt nicht viele Dinge in Clang. Selbst GCC ist mit Modulen nicht komplett, aber das Grundlegende ist erledigt.

Jason: Ich scrolle gerade durch diese Liste von Vergleichen. Und einige Dinge, wie Lambdas in nicht ausgewerteten Kontexten. Es klingt klein, ist aber für Bibliotheksentwickler enorm. Es wird nicht einmal als teilweise Unterstützung in Clang aufgeführt.

Rob: Hoffentlich holen sie bald auf.

Meeting C++-Umfrageergebnisse:Die beliebtesten C++-Standardfunktionen

Rob: Die Umfrageergebnisse von Meeting C++ waren eine Umfrage zu den beliebtesten Funktionen von C++. Der Gründer von Meeting C++, Jens Weller, zeigt die letztjährigen Umfrageergebnisse Seite an Seite mit den diesjährigen Ergebnissen. Einige sind nur ein wenig zurückgegangen, aber die meisten Funktionen scheinen von Jahr zu Jahr ziemlich konstant zu sein.

Jason: Eines der wichtigsten Dinge, die mir aufgefallen sind, war, dass die Histogramme von Jahr zu Jahr fast identisch sind, was ich wirklich nicht erwartet hatte. Aber es sind hier nur ein paar Kleinigkeiten. Es scheint, dass mehr Leute berichteten, dass sie C++14 nicht verwenden, was vielleicht nur eine andere Gruppe von Leuten ist, die auf diese Frage geantwortet haben, ich weiß es nicht.

Rob: Oder sie aktualisieren auf 17.

Jason: Ich schätze, sie haben die Frage vielleicht missverstanden und sagen:Nein, ich verwende nicht 14, ich verwende 17.

SonarSource:SonarLint, SonarQube und SonarCloud

Rob: Also, Loic, was kannst du uns über SonarSource-Tools erzählen?

Loïc Joly: Wir haben also SonarLint, SonarQube und SonarCloud. SonarLint ist eine IDE-Erweiterung. Und SonarQube und SonarCloud arbeiten mehr in der kontinuierlichen Integrationsphase. Mit unseren Tools können Sie Ihren Code beispielsweise für Pull-Requests analysieren und Pull-Requests blockieren, wenn er bestimmte Qualitätskriterien nicht erfüllt. Sie können auch die Geschichte des Codes sehen.

Rob: Welche IDEs unterstützt SonarLint?

Loïc Joly: Es unterstützt je nach Sprache unterschiedliche IDEs. Für C++ unterstützen wir Visual Studio. Einige wenige Tools unterstützen CLion.

Jason: Ich bin neugierig, welche Art von Tools erfordern eine vollständige Sichtbarkeit des Projekts?

Loïc Joly: Wie ungenutzte Funktionen.

Jason: Das ist interessant, weil ich gerade eine Woche oder so mit einem meiner Kunden verbracht habe, um etwa hunderttausend Codezeilen zu entfernen, die ungenutzt waren – eine beachtliche Leistung bei diesem Projekt.

Loïc Joly: Es ist nicht so einfach zu erkennen, dass etwas in C++ nicht verwendet wird. Es ist sehr knifflig, da Sie einige Funktionen haben, die nicht verwendet werden, die Sie aber trotzdem nicht entfernen möchten.

Jason: Sagt Ihr Tool, dass etwas völlig unbenutzt ist?

Loïc Joly: Nein. Wir stellen kein Tool zum Untersuchen Ihres Codes bereit. Wir konzentrieren uns nur darauf, Probleme anzusprechen und zu versuchen, das Problem zu erklären. Daher werden wir Ihnen alle interessanten Stellen zeigen, die nützlich sind, um zu verstehen, warum es ein Problem gibt, aber wir stellen kein Tool zur Verfügung, um Ihre Codebasis manuell zu untersuchen.

Rob: Für welche anderen Sprachen funktioniert die SonarSource-Analyse?

Loïc Joly: Ich glaube, wir haben 27 Sprachen, aber die Hauptsprache, auf die wir uns konzentrieren, ist Java. Wir haben hauptsächlich als Java-Unternehmen angefangen. Wir sind also im Java-Ökosystem sehr bekannt. Und dann haben wir auch Tools für C#, Python, JavaScript, Apps Script. Ich glaube, ich habe die wichtigsten erwähnt, und wenn ich einige vergessen habe, werden mich meine Kollegen morgen umbringen :).

Jason: Als wir dieses Interview besprachen, teilte mir zufällig einer meiner Freunde ein Problem mit, das SonarQube in seiner C#-Codebasis gefunden hatte. Es war besonders heimtückisch in ihrem Code und SonarQube fand das.

Jason: Ist SonarLint ein Open-Source-Projekt?

Loïc Joly: Nun, die Integration innerhalb der IDE ist Open Source, aber der Kern des C++-Analyzers ist Closed Source. Es ist jedoch kostenlos verfügbar. Es ist auch kostenlos verfügbar, wenn Sie SonarCloud in Open-Source-Projekten verwenden. Aber wenn Sie SonarCloud für ein abgeschlossenes Projekt oder C++-Analysen in SonarQube durchführen möchten, müssen Sie dafür bezahlen.

Rob: Gibt es also bestimmte Arten von Fehlern, die die SonarSource-Analysetools besonders gut finden können?

Loïc Joly: Wir haben eine ganze Reihe von Problemen in vielen verschiedenen Richtungen. Wir haben viel Wert im Vergleich zu anderen Tools. Wir kümmern uns nicht nur um das Erkennen eines Fehlers, sondern um Regeln.

Das ist also ein Unterschied. Zum Beispiel haben wir einige Regeln über die Fünfer- oder Nullerregel. Der Code könnte vollkommen korrekt sein, ohne diese Regeln zu befolgen, aber es ist so viel einfacher, Code zu lesen, der ihnen folgt.

Jason: Das ist interessant. Nur aus Neugier, haben Sie auch Regeln, die versuchen, den Missbrauch von Smart Pointern zu erkennen?

Loïc Joly: Nein, ich glaube nicht, dass wir es haben.

Rob: Sie haben das Visual Studio-Plugin erwähnt, läuft SonarSource auch unter Windows, Linux und Mac?

Loïc Joly: Der Kern von SonarSource läuft auf Windows, Linux und Mac iOS. SonarLint ist eher etwas für den Entwickler selbst. Während SonarCloud und SonarQube eher für Teams gedacht sind. Bei SonarLint kommt es wirklich darauf an. Zum Beispiel weiß ich, dass es für Java auch auf Eclipse und VS Code läuft, und ich habe nicht die vollständigen Metriken darüber, welche Sprache in welcher IDE unterstützt wird. Aber grundsätzlich versuchen wir natürlich, die Großen zu unterstützen.

Für SonarQube und SonarCloud haben wir also einige Regeln, die vom gesamten Team befolgt werden. Es wird bei jedem Pull-Request geteilt. Und in SonarLint gibt es auch das, was wir einen verbundenen Modus nennen, das heißt, wenn Sie auch SonarQube oder SonarCloud ausführen, können Sie damit synchronisieren.

Wenn Sie beispielsweise in SonarQube sagen, dass eine Regel für Sie falsch positiv ist, oder wenn Sie diese Regel nicht wollen, werden wir sie nicht mehr melden. Unsere Tools arbeiten also zusammen.

Jason: Sie haben also gesagt, dass SonarCloud für Open-Source-Projekte verfügbar ist, stimmt das?

Loïc Joly: Nun, es ist für Open Source oder Closed Source verfügbar und für Open Source ohne Einschränkungen kostenlos. Wenn Sie SonarCloud oder SonarQube einrichten möchten, ist es ein wenig Arbeit, SonarSource in Ihr CI zu integrieren, aber wenn Sie sich daran gewöhnt haben, sind es nur ein paar Zeilen Skript. Wir haben einige Kurzanleitungen und einige Beispielprojekte, die Sie sich ansehen können.

Implementierungsregeln

Rob: Sie haben also in Ihrer Biografie erwähnt, dass Sie während der Arbeit an der Stack-Analyse Regeln festlegen und anderen Entwicklern bei deren Implementierung helfen. Welche Art von Arbeit steckt hinter der Spezifikation neuer Regeln für die SonarSource-Analysetools?

Loïc Joly: Manchmal ist es sehr komplex und es gibt einige Regeln, für deren Spezifizierung wir mehr Zeit benötigt haben als für deren Entwicklung. Es mag überraschend erscheinen, aber ich habe sogar einen Blog-Artikel über einen von ihnen geschrieben.

Ein interessanter Teil über Regeln ist, woher wir die Inspiration bekommen. Zuerst müssen wir das Problem entdecken und dann entscheiden, wie wir es optimieren können. Wenn wir etwas tun, das nicht so gut funktioniert, versuchen wir uns daran zu erinnern, damit wir vielleicht in Zukunft eine Regel darüber schreiben. Inspiration für Regeln kommt aus Erfahrung und aus neuen Versionen der Standards. Also haben wir kürzlich einige Zeit damit verbracht, zu lesen, was es Neues in C++20 gibt, und versucht zu überlegen, ob es einige neue Regeln verdienen würde.

Wir nutzen CppCoreGuidelines auch als Inspirationsquelle, können aber Regeln aus CppCoreGuidelines nicht direkt umsetzen. Ein großer Teil der CppCoreGuideline erfordert, dass der Benutzer den Code auf eine sehr spezifische Weise schreibt, was nicht die typische Art ist, C++ zu schreiben.

Wir haben auch MISRA, das ist ein Codierungsstandard hauptsächlich für die Automobilindustrie, im Grunde ist es für sicherheitskritische Software. Es war also die aktuelle offizielle Version von MISRA 2008. Damals war es ein anderes C++. Jetzt aktualisieren wir es auf C++17. Ich weiß nicht genau, wann es erscheinen wird, aber wir versuchen, Regeln zu modernisieren, die in jeder Situation anwendbar sind, weil sicherheitskritischer Code besondere Vorsicht erfordert. Einige der Regeln könnten generisch sein. Einige von ihnen werden wahrscheinlich spezifisch für sicherheitskritische Software sein.

Rob: Wenn Sie also eines der SonarSource-Analysetools für Ihre Codebasis verwenden, haben Sie dann die Wahl zwischen MISRA, den Kernrichtlinien oder was auch immer?

Loïc Joly: Wir haben einige Flaggen auf den Regeln, die erklären, woher sie kommen. Wir haben die Möglichkeit, einen Regelsatz zu erstellen. Aber jetzt haben wir nicht die vollständige Abdeckung von MISRA C++ 2008, und wir hielten es nicht für interessant, diese vollständige Abdeckung zu entwickeln. Wir arbeiten an der nächsten Version von MISRA. Wir haben im Grunde ein Profil – Sonar Way, das ist das Regelwerk, von dem wir glauben, dass es unter allen Umständen anwendbar sein sollte.

Wenn wir eine Regel erstellen, testen wir sie an 30 oder 50 Open-Source-Projekten. Wir haben es auf LibreOffice, auf Clang und auf dem Linux-Kernel ausgeführt. Wir führen es in vielen großen Open-Source-Projekten aus und versuchen, die Ergebnisse zu sehen.

Jason: Wenn Benutzer also eine Regel festlegen, die auf SonarCloud ignoriert werden soll, behalten Sie diese Statistiken und sagen – Hey, es gibt ungefähr hunderttausend Benutzer, die alle diese Regel ignorieren. Vielleicht müssen wir uns das genauer ansehen.

Loïc Joly: Wir fangen an, diese Art von Feedback von den Benutzern zu bekommen. Aber zunächst mussten wir sicherstellen, dass wir dabei keine Geheimnisse der Kunden preisgeben. Wir müssen also vorsichtig sein, welche Informationen wir sammeln. Wir haben viele Anstrengungen in Bezug auf Regeln rund um die Sicherheit unternommen.

Jason: Es könnte so faszinierend sein, sich das anzusehen, weil man einerseits so sein möchte – tausend Leute ignorieren das, sie können eindeutig nicht alle falsch liegen, aber manchmal schätze ich, dass du es dir ansehen wirst und sei wie – wow, tausend Programmierer liegen total falsch!

Loïc Joly: Ich weiß, dass sie ein Experiment für eingebettete Software gemacht haben. Sie fügen die Anforderung hinzu, dass die Software zweimal entwickelt und zweimal in zwei verschiedenen parallelen Hardwaresystemen ausgeführt werden musste, nur um sicherzustellen, dass sie felsenfest war. Und die Teams, die das Programm entwickelt haben, waren verpflichtet, nicht miteinander zu reden. In einigen Fällen entdeckten sie, dass es denselben Fehler an derselben Stelle gab.

Jason: Wow.

Rob: Sie haben einige neuere Sicherheitsregeln für C++ erwähnt, was sind einige dieser neueren Regeln?

Loïc Joly: Aus Sicherheitsgründen war eine nicht so komplexe zu entwickelnde, aber meiner Meinung nach recht interessante Regel eine über die Verwendung von memset_s um zu versuchen, etwas Speicher zu löschen. Selbst wenn jemand Zugriff auf den Speicher erhält, sieht er kein Passwort, das dort gespeichert sein könnte.

Wir haben auch eine Reihe von Regeln rund um die POSIX-Funktionen, die hauptsächlich für C gelten, weil es in C so viel einfacher ist, einen Pufferüberlauf zu verursachen als in C++. Wir haben viele POSIX-Funktionen, die für char* funktionieren , und diesen Text zu Argumenten, einem Puffer und einer Größe.

Es ist unmöglich, in diesen Fällen perfekt zu sein, aber wir versuchen, uns zu verbessern. Außerdem werden wir versuchen, die Art und Weise zu verbessern, wie wir das Problem dem Benutzer melden. Wir haben diese Regeln, die versuchen zu erkennen, wenn Sie einige POSIX-Funktionen falsch verwenden und möglicherweise einen Pufferüberlauf haben. Wir erkennen auch, wenn Personen die falsche API verwenden.

Jason: Wow. Einige davon klingen wirklich fortgeschritten.

Loïc Joly: Ja. Wenn wir all diese Probleme gelöst haben, werde ich wahrscheinlich in Rente gehen. Jetzt haben wir einige Dinge, die zu guten Ergebnissen führen, aber wir haben noch viele Möglichkeiten, uns zu verbessern.

Jason: Sie sagten, Sie verwenden den statischen Analysator Clang für das Backend. Wenn ich also mein Projekt auf SonarCloud ausführe, erhalte ich dann alle Clang-Tidy-Regeln sowie Ihre Regeln? Oder werden Sie nur Ihre Regeln ausführen?

Loïc Joly: Wir basieren auf Clang, aber wir integrieren nicht alles von Clang IDE. Wir haben die Regeln selbst entworfen. Wir haben uns natürlich jede mögliche Quelle angeschaut, aber wir haben Clang IDE nicht einfach kopiert und eingefügt.

Jason: Wie viele Informationen erhalte ich, wenn ich von einem Ihrer Tools einen Regelverstoß erhalte? Sie sagten, viele der Regeln seien von den Kernrichtlinien inspiriert. Ich bin nur neugierig, ob ich bei einem Regelverstoß eine Dokumentation erhalte, die erklärt, warum dies eine schlechte Idee ist.

Loïc Joly: Grundsätzlich haben wir für jede Regel eine Dokumentation, in der wir versuchen zu erklären, warum wir die Regel haben. Dann haben wir fast immer ein Beispiel für schlechten Code und ein Beispiel dafür, wie man den Code umschreibt, damit er besser ist. Wenn die Regel von externen Quellen wie CppCoreGuideline oder MISRA inspiriert ist, verweisen wir darauf. Die Regel befindet sich an einer Stelle im Code, aber wir versuchen auch, auf andere Stellen des Codes zu verweisen, die interessant sind, um zu verstehen, warum die Regel ausgelöst wird.

Rob: Nun, schau, es war großartig, dich heute in der Show zu haben. Natürlich können die Leute alles auf sonarsource.com überprüfen. Aber wo können Zuhörer Sie online finden? Bist du auf Twitter oder Blog oder ähnlichem?

Loïc Joly: Nun, ich bin von der alten Schule. Ich habe kein Twitter. Ich habe ein paar Blogartikel im Blog von SonarSource. Leute kontaktieren mich per Mail. Das ist der Hauptweg, es zu tun. Ich meine, so hat es in den Neunzigern funktioniert. Warum sollte es heute nicht wieder funktionieren? :)

Rob: In Ordnung, wir fügen diese Links zu Ihrem Blog und allen anderen Podcast-Ressourcen hinzu. Danke fürs Kommen.

Loïc Joly: Danke.

Rob: Vielen Dank fürs Lesen, während wir uns über C++ unterhalten.

Wir würden gerne hören, was Sie von dem Podcast halten. Bitte teilen Sie uns mit, wenn wir über Themen diskutieren, die Sie interessieren, oder wenn Sie einen Vorschlag für ein Thema haben, wir würden uns auch freuen, davon zu hören. Sie können alle Ihre Gedanken per E-Mail an [email protected] senden. Wir würden uns auch freuen, wenn Sie CppCast auf Twitter mögen und ihm folgen könnten. Sie können mir auch unter @robwirving und Jason unter @lefticus auf Twitter folgen.

Wir möchten uns auch bei all unseren Gönnern bedanken, die die Show über Patreon unterstützen. Wenn Sie uns auf Patreon unterstützen möchten, können Sie dies unter patreon.com/CppCast tun. Und natürlich finden Sie all diese Informationen in den Shownotes auf der Podcast-Website unter cppcast.com. Die Titelmusik für diese Folge wurde von podcastthemes.com bereitgestellt.

Ressourcen

Podcast

  • SonarSource-Analysetools

Neuigkeiten

  • VS 2019 STL ist C++20 Feature Complete
  • GCC 11.1 veröffentlicht
  • Meeting C++-Umfrageergebnisse:die beliebtesten C++-Standardfunktionen

Links

  • SonarSource
  • Die unendliche Geschichte des Schreibens einer Regel für die Übergabe von Argumenten in C++

Sponsoren

  • C++ Builder

Hinweis von PVS-Studio

Wir möchten Sie daran erinnern, dass Sie das PVS-Studio-Plugin für SonarQube verwenden können. In diesem Fall wird PVS-Studio zu einer zusätzlichen Datenquelle für Fehler und potenzielle Schwachstellen. SonarQube ist ein praktisches Tool, mit dem Sie Warnungen verarbeiten können, die von verschiedenen Tools ausgegeben werden. Sehen Sie sich den Link zur Dokumentation an:„Integrating PVS-Studio Analysis Results into SonarQube“.