Sehen Sie, welche API-Testlösung im GigaOm Radar Report am besten abgeschnitten hat. Holen Sie sich Ihren kostenlosen Analystenbericht >>

Sehen Sie, welche API-Testlösung im GigaOm Radar Report am besten abgeschnitten hat. Holen Sie sich Ihren kostenlosen Analystenbericht >>
Zum Abschnitt springen
Ein falsch positives Ergebnis entsteht, wenn ein statisches Analysetool fälschlicherweise behauptet, dass eine statische Regel verletzt wurde. Dieser Artikel geht sehr detailliert auf False Positives und statische Codeanalyse ein.
Zum Abschnitt springen
Zum Abschnitt springen
„Zu viele falsch positive Ergebnisse“ ist wahrscheinlich die häufigste Ausrede, um statische Analysen zu vermeiden. Aber die statische Analyse muss nicht so laut sein.
Vor Jahren die größte Herausforderung in Statische Softwareanalyse versuchte, immer interessantere Dinge zum Überprüfen zu finden. In Parasofts ursprünglichem CodeWizard-Produkt in den frühen 90er Jahren hatten wir etwa 30 Regeln, die auf Elementen aus dem Buch von Scott Meyers basierten. Effektives C ++. Es war das, was ich gerne als „Angst gerade für Programmierer.“ Ich erwähnte das einmal gegenüber Scott, und obwohl er es nicht so gesehen hatte, brachte es ihn doch ziemlich zum Lachen.
Seitdem haben die Forscher der statischen Analyse ständig daran gearbeitet, die Grenzen dessen, was erkannt werden kann, zu erweitern, die Möglichkeiten der statischen Analyse zu erweitern und Fehler statt nur eines schwachen Codes zu identifizieren. Aber es leidet immer noch unter falsch positiven Ergebnissen. Die statische Analyse hat den Fokus des Benutzers verändert, vom Härten des Codes hin zur Suche nach Fehlern, was großartig ist, aber jetzt ist eine der häufigsten Hürden, auf die Menschen bei der statischen Codeanalyse stoßen, zu versuchen, die erhaltenen Ergebnisse zu verstehen.
Obwohl die Leute sagen: „Ich wünschte, die statische Analyse würde ____ erkennen“ (benennen Sie Ihren bevorzugten nicht auffindbaren Fehler). Viel häufiger hört man: „Wow, ich habe viel zu viele Ergebnisse!“ oder „Statische Analyse ist verrauscht!“ oder „False Positives bei statischen Analysen sind überwältigend!“ Als Softwaretestorganisation ist es unsere Aufgabe, dieses Problem für unsere Kunden weiterhin zu lösen – weiterhin Tools und Funktionen bereitzustellen, die Ihnen helfen, die erhaltenen Ergebnisse zu sortieren und zu verstehen, welche Probleme das größte Risiko darstellen.
Statische Analysetools kommen Entwicklern zugute indem Sie Fehler, Sicherheitslücken und Codierungsstandardabweichungen finden, die ansonsten mühsam zu finden oder durchzusetzen wären.
Statische Analyse- und SAST-Tools (Static Application Security Testing) bieten Entwicklerteams die folgenden Vorteile.
Statische Analyse und SAST sind keine Allheilmittel. Tatsächlich empfiehlt Parasoft seinen Kunden, statische Analysen in Verbindung mit anderen Testmethoden wie Unit-Tests, Regressionstests und mehr zu verwenden. Statische Analyselösungen wie Parasoft bieten hervorragende Kapitalrenditen, es ist jedoch sinnvoll, die Einschränkungen zu verstehen.
Im Zusammenhang mit der statischen Analyse tritt ein falsch positives Ergebnis auf, wenn ein statisches Analysetool fälschlicherweise meldet, dass eine statische Analyseregel verletzt wurde. Natürlich kann dies subjektiv sein. Manchmal tappen Entwickler in die Falle und kennzeichnen jede Fehlermeldung, die ihnen nicht gefällt, als falsch positiv, aber das ist nicht wirklich richtig.
In vielen Fällen sind sie mit der Regel einfach nicht einverstanden, verstehen nicht, wie sie in der jeweiligen Situation anzuwenden ist, oder halten sie im Allgemeinen nicht für wichtig. Ich würde das nennen Lärm, und kein falsch positives Ergebnis. Das Witzige dabei ist, dass je cleverer das Tool ist, desto wahrscheinlicher ist es, dass es zu einem Ergebnis führt, das ein Entwickler auf den ersten Blick vielleicht nicht versteht.
Die musterbasierte statische Analyse weist eigentlich keine Fehlalarme auf. Wenn das Tool meldet, dass gegen eine statische Analyseregel verstoßen wurde, obwohl dies nicht der Fall war, weist dies auf einen Fehler in der Regel hin, da die Regel nicht mehrdeutig sein sollte. Wenn die Regel kein klares Muster aufweist, nach dem gesucht werden muss, ist sie eine schlechte Regel.
Ich sage nicht, dass jeder gemeldete Regelverstoß auf das Vorliegen eines Mangels hinweist. Ein Verstoß bedeutet, dass das Muster gefunden wurde, was auf eine Schwachstelle im Code hinweist, also auf die Anfälligkeit für einen Fehler.
Wenn ich mir einen Verstoß ansehe, frage ich mich, ob diese Regel auf meinen Code zutrifft oder nicht. Wenn es zutrifft, korrigiere ich den Code. Ist dies nicht der Fall, unterdrücke ich den Verstoß. Es ist am besten, Verstöße gegen die statische Analyse direkt im Code zu unterdrücken, damit er für Teammitglieder sichtbar ist und Sie ihn nicht ein zweites Mal überprüfen müssen. Andernfalls werden Sie immer wieder denselben Verstoß überprüfen; Es ist, als würde man versuchen, die Rechtschreibung zu überprüfen, aber niemals die „besonderen“ Wörter in das Wörterbuch aufnehmen.
Das Schöne an der Unterdrückung im Code ist, dass sie unabhängig von der statischen Analyse-Engine ist. Jeder kann sich den Code ansehen und sehen, dass der Code überprüft wurde und dass dieses Muster in diesem Code als akzeptabel erachtet wird. Dies ist besonders nützlich, wenn Sie die Einhaltung eines Codierungsstandards nachweisen müssen. Und wenn Sie tatsächlich Konformität benötigen, können Sie ganz einfach eine vorhandene Konfiguration für diese Standards verwenden, z CWE, MISRA, IEC 62304, DO-178Cund vieles mehr.
Bei der flussbasierten Analyse sind falsch positive Ergebnisse nicht nur der Methode inhärent, sondern auch relevant - und müssen angegangen werden. Die Durchflussanalyse kann Fehlalarme nicht vermeiden, aus dem gleichen Grund, aus dem Unit-Tests keine perfekten Unit-Testfälle generieren können. Die Analyse muss Bestimmungen über das erwartete Verhalten des Codes treffen. Manchmal gibt es zu viele Optionen, um zu wissen, was realistisch ist. Manchmal haben Sie einfach nicht genug Informationen darüber, was in anderen Teilen des Systems passiert.
Das Wichtigste dabei ist, dass das wahre Falsch-Positive etwas ist, das einfach völlig falsch ist. Angenommen, das von Ihnen verwendete statische Analysetool gibt an, dass Sie einen Nullzeiger lesen. Wenn Sie sich den Code ansehen und feststellen, dass dies tatsächlich unmöglich ist, haben Sie ein falsches Positiv.
Wenn Sie sich andererseits einfach keine Sorgen über Nullen in diesem Codeteil machen, weil sie woanders verarbeitet werden, dann ist die Nachricht zwar nicht wichtig für Sie, aber kein falsch positives Ergebnis. Es ist wahr und zufällig unwichtig. Die Botschaften eines Flussanalysetools reichen von „wahr und wichtig“ über „wahr und unwichtig“ und „wahr und unwahrscheinlich“ bis „unwahr“. Hier gibt es viele Variationen und jede sollte anders gehandhabt werden.
Auch hier gibt es eine häufige Falle. Wie im obigen Null-Beispiel glauben Sie vielleicht, dass ein Nullwert diesen Punkt nicht erreichen kann, aber das Tool hat einen Weg gefunden, dies zu erreichen. Wenn dies für Ihre Anwendung wichtig ist, sollten Sie dies unbedingt überprüfen und ggf. davor schützen.
Es ist wichtig zu verstehen, dass es bei der Flussanalyse sowohl Stärken als auch Schwächen gibt. Die Stärke der Flussanalyse besteht darin, dass sie den Code durchgeht und versucht, Hotspots zu finden und dann Probleme in der Umgebung der Hotspots zu finden. Die Schwäche besteht darin, dass Annahmen getroffen werden müssen, um zu versuchen, den Code zu durchlaufen, und je weiter er durchläuft, desto wahrscheinlicher ist es, dass ein unwahrscheinlicher Pfad entsteht.
Das eigentliche Problem ist, dass Sie sich etwas vormachen, wenn Sie glauben, Sie hätten den gesamten Code bereinigt, weil Ihre Flussanalyse sauber ist. Wirklich, Sie haben einige Fehler gefunden und sollten dafür dankbar sein. Das Fehlen von Fehlern bei der Flussanalyse bedeutet nur, dass Sie nichts gefunden haben und nicht, dass der Code sauber ist. Stellen Sie am besten sicher, dass Sie ein Tool wie verwenden C / C ++ - Test, dotTEST, oder auch Test Dies hat beide Arten der statischen Analyse, wenn Sie sicherheitskritische Software erstellen
Trotz gegenteiliger Behauptungen erzeugt jedes statische Analysetool falsch-positive Ergebnisse und übersieht echte Fehler – falsch-negative Ergebnisse. Zwischen fehlenden Mängeln und dem Erhalt zu vieler Berichte müssen Kompromisse eingegangen werden.
Statische Analysetools müssen stattdessen danach bewertet werden, was sie finden – und wie gut diese dargestellt werden – und wie viele Fehler sie übersehen. Tools, die darauf abgestimmt sind, falsch-positive Ergebnisse zu reduzieren, haben zwangsläufig höhere falsch-negative Ergebnisse. Lohnt es sich, echte Fehler zu übersehen, um weniger Meldungen zu erhalten?
Hier sind einige Dinge, die Sie bei der Abwägung zwischen falsch-positiven und falsch-negativen Ergebnissen beachten sollten.
Der erste Schritt besteht also darin, Ihre Codeanalyse entsprechend zu konfigurieren und unnötiges Rauschen zu reduzieren. Stellen Sie sicher, dass die richtigen Prüfer mit dem richtigen Code ausgeführt werden. Wenn Sie beispielsweise ein Problem mit einem bestimmten Prüfprogramm nicht beheben möchten, deaktivieren Sie es. Oder wenn Sie Legacy-Code haben, der schon seit vielen Jahren im Einsatz ist und nur ein gemeldeter Fehler Sie zu Änderungen zwingen kann, warum sollten Sie sich dann die Mühe machen, ihn zu analysieren?
Wenn Sie jedoch eine statische Analyse einer großen Codebasis durchführen und eine riesige Liste von Verstößen erhalten, sollten Sie sich nicht überfordern. Es dauert nicht lange, zu lernen, Ergebnisse basierend auf Risiko und Auswirkungen zu priorisieren und sich zuerst auf die höchste Priorität zu konzentrieren. Viele Beschwerden über statische Analysetools beruhen auf Eindrücken von Tools und Funktionen älterer Generationen.
Organisationen müssen ihr eigenes Risiko und die damit verbundenen Kosten ermitteln. Der ideale Kompromiss besteht darin, so wenige falsch-positive Ergebnisse wie möglich zu haben und gleichzeitig falsch-negative Ergebnisse zu minimieren.
Eine großartige, aber häufig übersehene Möglichkeit, die Flussanalyse zu ergänzen, ist die Erkennung von Laufzeitfehlern. Die Laufzeitfehlererkennung hilft Ihnen dabei, viel kompliziertere Probleme zu finden, als die Flussanalyse erkennen kann, und Sie haben das Vertrauen, dass der Zustand tatsächlich aufgetreten ist. Die Laufzeitfehlererkennung weist keine falsch positiven Ergebnisse auf, wie dies bei der statischen Analyse der Fall ist. Wenn ein Fehler festgestellt wird, liegt dies daran, dass er tatsächlich beobachtet hat, dass er während der Ausführung auftritt. Es gibt keine Annahmen.
Ihr Laufzeitregelsatz sollte eng mit Ihrem statischen Analyseregelsatz übereinstimmen. Die Regeln können die gleichen Arten von Problemen finden, aber die Laufzeitanalyse verfügt über eine große Anzahl von Ausführungspfaden. Dies liegt daran, dass zur Laufzeit Stubs, Setup, Initialisierung usw. kein Problem darstellen, wie dies bei der Flussanalyse der Fall ist. Die einzige Einschränkung besteht darin, dass es nur so gut ist wie Ihre Testsuite, da es die Pfade überprüft, die Ihre Testsuite gerade ausführt. Wenn Sie in C oder C ++ programmieren, insbesondere in eingebetteten Geräten wie IoT, werfen Sie einen Blick darauf ++ versichern - Es kann zur Laufzeit mehr Fehler finden als jedes andere Tool. Anstatt sich durch knifflige Probleme wie Thread-Probleme, Speicherlecks und Race-Bedingungen festzumachen, können Sie diese zur Laufzeit genau finden.
Mein Ansatz für falsch positive Ergebnisse lautet wie folgt: Wenn es 3 Tage dauert, um einen Fehler zu beheben, ist es besser, 20 Minuten damit zu verbringen, ein falsch positives Ergebnis zu untersuchen… solange ich es markieren kann und es nie wieder ansehen muss. Es geht darum, es im richtigen Kontext zu betrachten. Angenommen, Sie haben ein Problem mit Threads. Probleme mit Threads sind dramatisch schwer zu entdecken. Wenn Sie ein Problem im Zusammenhang mit Threads finden möchten, kann es Wochen dauern, bis Sie es gefunden haben. Ich würde es vorziehen, den Code so zu schreiben, dass überhaupt keine Probleme auftreten können. Mit anderen Worten, ich versuche, meinen Prozess von der Erkennung zur Prävention zu verlagern.
Bei ordnungsgemäßer Bereitstellung muss die statische Analyse keine unangenehme Erfahrung sein. Schauen Sie sich an, wie wir die Dinge anders machen Parasoft, vor allem mit der vollen Kraft von Parasoft DTP Verwalten von Ergebnissen mit intelligenten Analysen, mit denen Sie sich auf das Risiko in Ihrer Software konzentrieren können, anstatt unwichtige Probleme zu verfolgen.
„MISRA“, „MISRA C“ und das Dreieckslogo sind eingetragene Marken von The MISRA Consortium Limited. ©The MISRA Consortium Limited, 2021. Alle Rechte vorbehalten.