SCW-Symbole
Held-Hintergrund ohne Trennlinie
Blog

Java-Falle – Bitweise Operatoren und Boolesche Operatoren

Alan Richardson
Veröffentlicht Feb 07, 2021
Zuletzt aktualisiert am 09. März 2026

Java-Falle – Bitweise Operatoren und Boolesche Operatoren

„Java Gotcha“ – ein häufig auftretendes Fehlermuster, das leicht unbeabsichtigt implementiert werden kann.

Ein relativ einfaches Java-Problem, das unerwartet auftritt, ist die Verwendung von Bitoperatoren anstelle von booleschen Vergleichsoperatoren.

Wenn Sie beispielsweise eigentlich „&&“ schreiben wollten, könnte ein einfacher Eingabefehler dazu führen, dass stattdessen „&“ geschrieben wird.

Eine gängige Heuristik, die wir beim Überprüfen von Code gelernt haben, lautet:

> Die Verwendung von „&“ oder „|“ in einer Bedingungsanweisung ist möglicherweise unbeabsichtigt.

In diesem Blogbeitrag werden wir heuristische Methoden untersuchen und Wege zur Erkennung und Behebung dieses Codierungsproblems aufzeigen.


Wo liegt das Problem? Mit Booleschen Operationen kann die Bitweise Operation normal durchgeführt werden.


Die Verwendung von Bitoperatoren mit booleschen Werten ist völlig zulässig, daher meldet Java keinen Syntaxfehler.

Wenn ich einen JUnit-Test erstelle, um die Wahrheitstabelle für bitweise ODER- (|) und bitweise UND-Operationen (&) zu untersuchen, werden wir feststellen, dass die Ausgabe der bitweisen Operatoren mit der Wahrheitstabelle übereinstimmt. Angesichts dessen könnten wir zu dem Schluss kommen, dass die Verwendung von bitweisen Operatoren kein Problem darstellt.

UND 真相表

Drei Spalten, eine mit a, eine mit b und die letzte mit (a^b)


@Test
void 按位运算符和 TruthTable () {
assertions.asserteQuals(真、真和真);
assertions.asserteQuals(假、对和错);
assertions.asserteQuals(假、假和真);
assertions.asserteQuals(假、假和假);
}


Der Test wurde bestanden, dies ist vollständig gültiges Java.


OR 真相表


Drei Spalten, eine mit a, eine mit b und die letzte mit (a v b)


@Test
void BitwiseOperatorOrTruthTable() {
assertions.asserteQuals(true, true | true);
assertions.asserteQuals(true, true | false);
assertions.asserteQuals(true, false | true);
assertions.asserteQuals(false, false | false);
}


Dieser Test wurde ebenfalls bestanden. Warum bevorzugen wir „&&“ und „||“?


Die Wahrheitstabelle ist ein mit dem Wahrheitstabellen-Tool von web.standfor.eduerstellt.


Problem: Kurzschlussbetrieb


Das eigentliche Problem ist der Unterschied im Verhalten zwischen Bitoperationen (&, |) und Booleschen Operatoren (&&, ||).

Boolesche Operatoren sind Kurzschlussoperatoren und werden nur bei Bedarf ausgewertet.

例如

if (args!= null & args.length () > 23) {
system.out.println (args);
}


Im obigen Code werden beide booleschen Bedingungen ausgewertet, da der Bitweise-Operator verwendet wird:

  • args!= leerer Wert
  • args.length () > 23

Wenn args leer ist, besteht für meinen Code das Risiko einer NullPointerException, da wir args.length immer überprüfen, auch wenn der Parameter leer ist, da zwei boolesche Bedingungen ausgewertet werden müssen.


Boolesche Operatoren mit Kurzschlussauswertung


Bei Verwendung von &&, zum Beispiel

if (args!= null && args.length () > 23) {
system.out.println (args);
}


Sobald wir wissen, dass args != null, ist das Ergebnis false und die Berechnung der Bedingungsausdrücke wird beendet.

Wir brauchen die rechte Seite nicht zu bewerten.

Unabhängig vom Ergebnis der rechten Bedingung ist der endgültige Wert des booleschen Ausdrucks immer falsch.


Aber das wird im Produktionscode niemals passieren.


Dies ist ein leicht zu begehender Fehler, den statische Analysewerkzeuge nicht immer machen.

Ich habe die folgenden Google-Dork-Suchbegriffe verwendet, um zu sehen, ob ich öffentliche Beispiele für dieses Muster finden kann:

Dateityp: java if „!=null &”
Diese Suche hat in rootwindowContainer einige Codes aus Android gefunden.
isDocument = intent != null & intent.isDocument ()


Dieser Code könnte die Codeüberprüfung passieren, da wir häufig Bitoperatoren in Zuweisungsanweisungen verwenden, um Werte zu maskieren. In diesem Fall ist das Ergebnis jedoch dasselbe wie im obigen Beispiel mit der if-Anweisung. Wenn intent immer leer ist, wird eine NullPointerException ausgelöst.

Wir entkommen dieser Struktur oft, weil wir häufig defensiv programmieren und redundanten Code schreiben. Die Überprüfung „!= null“ ist in den meisten Anwendungsfällen wahrscheinlich überflüssig.

Dies ist ein Fehler, den Programmierer beim Erstellen von Code machen.

Ich weiß nicht, wie aktuell die Suchergebnisse sind, aber als ich eine Suche durchgeführt habe, stammten die zurückgegebenen Codes von: Google, Amazon, Apache... und mir.

Die jüngsten Pull-Anfragen in einem meiner Open-Source-Projekte dienen genau dazu, diesen Fehler zu beheben.

if (键入!=null & type.trim () .length () >0) {
AcceptMediatypeDefinitionsList.add (type.trim ());
}


Wie finde ich das?


Als ich meinen Beispielcode in mehreren statischen Analysatoren überprüfte, haben sie diesen versteckten Selbstzerstörungscode nicht entdeckt.

Als Team Secure Code Warrior haben wir eine relativ einfache Sensei erstellt und überprüft, mit der dieses Problem gelöst werden kann.

Da Bitoperatoren sehr leistungsfähig sind und häufig für Zuweisungen verwendet werden, haben wir uns auf Anwendungsfälle von if-Anweisungen und die Verwendung von Bitwise & konzentriert, um problematischen Code zu finden.

搜索:
表情:
AnyOF:
-在:
条件:{}
价值:
区分大小写:假
匹配:“.* &。*”


Wenn es als Bedingungsausdruck verwendet wird, verwendet es reguläre Ausdrücke, um „&“ abzugleichen. Zum Beispiel in einer if-Anweisung.

Um dieses Problem zu beheben, greifen wir erneut auf reguläre Ausdrücke zurück. Diesmal verwenden wir die sed-Funktion in QuickFix, um & im Ausdruck global durch && zu ersetzen.

Verfügbare Korrektur:
- Name: „Bitweises AND-Operator durch logisches AND-Operator ersetzen”
Aktion:
- Überschreiben:
Ändern in: „{{#sed}} s/&/&&&g,{{{.}}} {{/sed}}”


Fußnote

Dies deckt den häufigsten Missbrauch von Bitoperatoren ab, nämlich die tatsächliche Verwendung von Booleschen Operatoren.

In anderen Fällen kann dies vorkommen, beispielsweise bei Aufgabenbeispielen, aber beim Erstellen von Rezepten müssen wir falsch-positive Erkennungen so weit wie möglich vermeiden, da die Rezepte sonst ignoriert oder geschlossen werden. Wir erstellen Rezepte, die den häufigsten Fällen entsprechen. Mit der Weiterentwicklung von Sensei werden wir wahrscheinlich zusätzliche Spezifitäten in die Suchfunktion integrieren, um mehr Übereinstimmungsbedingungen abzudecken.

In der aktuellen Form wird diese Formel viele praktische Anwendungsfälle erkennen, vor allemden in meinem Projekt beschriebenen.

Hinweis: Viele Code-Helden haben zu diesem Beispiel und der Überprüfung des Rezepts beigetragen – Charlie Erikson, Matthew Carley, Robin Clairhout, Bryson Ax, Nathan Desmet und Donny Robershoten. Vielen Dank für eure Hilfe.


---


Sie können Sensei über „Einstellungen\Plugins“ (Mac) oder „Einstellungen\Plugins“ (Windows) in IntelliJ installieren Sensei nachsensei suchen.

Im Repositorysensei des Secure Code Warrior finden Sie den Quellcode und die Rezepte für viele dieser Blog-Beiträge (einschließlich dieses Beitrags).

https://github.com/securecodewarrior/sensei-blog-examples

Erfahren Sie Sensei


Ressourcen anzeigen
Ressourcen anzeigen

In diesem Blogbeitrag werden wir häufige Java-Codierungsfehler (Verwendung von Bitoperatoren anstelle von bedingten Operatoren) untersuchen, die Fehler, für die unser Code dadurch anfällig wird, und wie man Sensei Fehlerbehebung und -erkennung einsetzen Sensei .

Interessiert an mehr?

Alan Richardson verfügt über mehr als zwanzig Jahre Berufserfahrung in der IT-Branche. Er arbeitete als Entwickler und auf jeder Ebene der Testhierarchie, vom Tester bis hin zum Head of Testing. Als Head of Developer Relations bei Secure Code Warrior arbeitet er direkt mit Teams zusammen, um die Entwicklung von hochwertigem, sicherem Code zu verbessern. Alan ist der Autor von vier Büchern, darunter "Dear Evil Tester" und "Java For Testers". Alan hat auch Online-Schulungen courses erstellt, um Menschen beim Erlernen von technischen Web-Tests und Selenium WebDriver mit Java zu helfen. Alan veröffentlicht seine Schriften und Schulungsvideos auf SeleniumSimplified.com, EvilTester.com, JavaForTesters.com und CompendiumDev.co.uk.

mehr erfahren

Secure Code Warrior kann Ihrem Unternehmen dabei helfen, Code während des gesamten Softwareentwicklungszyklus zu schützen und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, Chief Information Security Officer oder in einem anderen sicherheitsrelevanten Bereich tätig sind – wir können Ihrem Unternehmen dabei helfen, die mit unsicherem Code verbundenen Risiken zu minimieren.

Demo buchen
Teilen auf:
LinkedIn-MarkenSozialx Logo
作者
Alan Richardson
Veröffentlicht Feb 07, 2021

Alan Richardson verfügt über mehr als zwanzig Jahre Berufserfahrung in der IT-Branche. Er arbeitete als Entwickler und auf jeder Ebene der Testhierarchie, vom Tester bis hin zum Head of Testing. Als Head of Developer Relations bei Secure Code Warrior arbeitet er direkt mit Teams zusammen, um die Entwicklung von hochwertigem, sicherem Code zu verbessern. Alan ist der Autor von vier Büchern, darunter "Dear Evil Tester" und "Java For Testers". Alan hat auch Online-Schulungen courses erstellt, um Menschen beim Erlernen von technischen Web-Tests und Selenium WebDriver mit Java zu helfen. Alan veröffentlicht seine Schriften und Schulungsvideos auf SeleniumSimplified.com, EvilTester.com, JavaForTesters.com und CompendiumDev.co.uk.

Teilen auf:
LinkedIn-MarkenSozialx Logo

Java-Falle – Bitweise Operatoren und Boolesche Operatoren

„Java Gotcha“ – ein häufig auftretendes Fehlermuster, das leicht unbeabsichtigt implementiert werden kann.

Ein relativ einfaches Java-Problem, das unerwartet auftritt, ist die Verwendung von Bitoperatoren anstelle von booleschen Vergleichsoperatoren.

Wenn Sie beispielsweise eigentlich „&&“ schreiben wollten, könnte ein einfacher Eingabefehler dazu führen, dass stattdessen „&“ geschrieben wird.

Eine gängige Heuristik, die wir beim Überprüfen von Code gelernt haben, lautet:

> Die Verwendung von „&“ oder „|“ in einer Bedingungsanweisung ist möglicherweise unbeabsichtigt.

In diesem Blogbeitrag werden wir heuristische Methoden untersuchen und Wege zur Erkennung und Behebung dieses Codierungsproblems aufzeigen.


Wo liegt das Problem? Mit Booleschen Operationen kann die Bitweise Operation normal durchgeführt werden.


Die Verwendung von Bitoperatoren mit booleschen Werten ist völlig zulässig, daher meldet Java keinen Syntaxfehler.

Wenn ich einen JUnit-Test erstelle, um die Wahrheitstabelle für bitweise ODER- (|) und bitweise UND-Operationen (&) zu untersuchen, werden wir feststellen, dass die Ausgabe der bitweisen Operatoren mit der Wahrheitstabelle übereinstimmt. Angesichts dessen könnten wir zu dem Schluss kommen, dass die Verwendung von bitweisen Operatoren kein Problem darstellt.

UND 真相表

Drei Spalten, eine mit a, eine mit b und die letzte mit (a^b)


@Test
void 按位运算符和 TruthTable () {
assertions.asserteQuals(真、真和真);
assertions.asserteQuals(假、对和错);
assertions.asserteQuals(假、假和真);
assertions.asserteQuals(假、假和假);
}


Der Test wurde bestanden, dies ist vollständig gültiges Java.


OR 真相表


Drei Spalten, eine mit a, eine mit b und die letzte mit (a v b)


@Test
void BitwiseOperatorOrTruthTable() {
assertions.asserteQuals(true, true | true);
assertions.asserteQuals(true, true | false);
assertions.asserteQuals(true, false | true);
assertions.asserteQuals(false, false | false);
}


Dieser Test wurde ebenfalls bestanden. Warum bevorzugen wir „&&“ und „||“?


Die Wahrheitstabelle ist ein mit dem Wahrheitstabellen-Tool von web.standfor.eduerstellt.


Problem: Kurzschlussbetrieb


Das eigentliche Problem ist der Unterschied im Verhalten zwischen Bitoperationen (&, |) und Booleschen Operatoren (&&, ||).

Boolesche Operatoren sind Kurzschlussoperatoren und werden nur bei Bedarf ausgewertet.

例如

if (args!= null & args.length () > 23) {
system.out.println (args);
}


Im obigen Code werden beide booleschen Bedingungen ausgewertet, da der Bitweise-Operator verwendet wird:

  • args!= leerer Wert
  • args.length () > 23

Wenn args leer ist, besteht für meinen Code das Risiko einer NullPointerException, da wir args.length immer überprüfen, auch wenn der Parameter leer ist, da zwei boolesche Bedingungen ausgewertet werden müssen.


Boolesche Operatoren mit Kurzschlussauswertung


Bei Verwendung von &&, zum Beispiel

if (args!= null && args.length () > 23) {
system.out.println (args);
}


Sobald wir wissen, dass args != null, ist das Ergebnis false und die Berechnung der Bedingungsausdrücke wird beendet.

Wir brauchen die rechte Seite nicht zu bewerten.

Unabhängig vom Ergebnis der rechten Bedingung ist der endgültige Wert des booleschen Ausdrucks immer falsch.


Aber das wird im Produktionscode niemals passieren.


Dies ist ein leicht zu begehender Fehler, den statische Analysewerkzeuge nicht immer machen.

Ich habe die folgenden Google-Dork-Suchbegriffe verwendet, um zu sehen, ob ich öffentliche Beispiele für dieses Muster finden kann:

Dateityp: java if „!=null &”
Diese Suche hat in rootwindowContainer einige Codes aus Android gefunden.
isDocument = intent != null & intent.isDocument ()


Dieser Code könnte die Codeüberprüfung passieren, da wir häufig Bitoperatoren in Zuweisungsanweisungen verwenden, um Werte zu maskieren. In diesem Fall ist das Ergebnis jedoch dasselbe wie im obigen Beispiel mit der if-Anweisung. Wenn intent immer leer ist, wird eine NullPointerException ausgelöst.

Wir entkommen dieser Struktur oft, weil wir häufig defensiv programmieren und redundanten Code schreiben. Die Überprüfung „!= null“ ist in den meisten Anwendungsfällen wahrscheinlich überflüssig.

Dies ist ein Fehler, den Programmierer beim Erstellen von Code machen.

Ich weiß nicht, wie aktuell die Suchergebnisse sind, aber als ich eine Suche durchgeführt habe, stammten die zurückgegebenen Codes von: Google, Amazon, Apache... und mir.

Die jüngsten Pull-Anfragen in einem meiner Open-Source-Projekte dienen genau dazu, diesen Fehler zu beheben.

if (键入!=null & type.trim () .length () >0) {
AcceptMediatypeDefinitionsList.add (type.trim ());
}


Wie finde ich das?


Als ich meinen Beispielcode in mehreren statischen Analysatoren überprüfte, haben sie diesen versteckten Selbstzerstörungscode nicht entdeckt.

Als Team Secure Code Warrior haben wir eine relativ einfache Sensei erstellt und überprüft, mit der dieses Problem gelöst werden kann.

Da Bitoperatoren sehr leistungsfähig sind und häufig für Zuweisungen verwendet werden, haben wir uns auf Anwendungsfälle von if-Anweisungen und die Verwendung von Bitwise & konzentriert, um problematischen Code zu finden.

搜索:
表情:
AnyOF:
-在:
条件:{}
价值:
区分大小写:假
匹配:“.* &。*”


Wenn es als Bedingungsausdruck verwendet wird, verwendet es reguläre Ausdrücke, um „&“ abzugleichen. Zum Beispiel in einer if-Anweisung.

Um dieses Problem zu beheben, greifen wir erneut auf reguläre Ausdrücke zurück. Diesmal verwenden wir die sed-Funktion in QuickFix, um & im Ausdruck global durch && zu ersetzen.

Verfügbare Korrektur:
- Name: „Bitweises AND-Operator durch logisches AND-Operator ersetzen”
Aktion:
- Überschreiben:
Ändern in: „{{#sed}} s/&/&&&g,{{{.}}} {{/sed}}”


Fußnote

Dies deckt den häufigsten Missbrauch von Bitoperatoren ab, nämlich die tatsächliche Verwendung von Booleschen Operatoren.

In anderen Fällen kann dies vorkommen, beispielsweise bei Aufgabenbeispielen, aber beim Erstellen von Rezepten müssen wir falsch-positive Erkennungen so weit wie möglich vermeiden, da die Rezepte sonst ignoriert oder geschlossen werden. Wir erstellen Rezepte, die den häufigsten Fällen entsprechen. Mit der Weiterentwicklung von Sensei werden wir wahrscheinlich zusätzliche Spezifitäten in die Suchfunktion integrieren, um mehr Übereinstimmungsbedingungen abzudecken.

In der aktuellen Form wird diese Formel viele praktische Anwendungsfälle erkennen, vor allemden in meinem Projekt beschriebenen.

Hinweis: Viele Code-Helden haben zu diesem Beispiel und der Überprüfung des Rezepts beigetragen – Charlie Erikson, Matthew Carley, Robin Clairhout, Bryson Ax, Nathan Desmet und Donny Robershoten. Vielen Dank für eure Hilfe.


---


Sie können Sensei über „Einstellungen\Plugins“ (Mac) oder „Einstellungen\Plugins“ (Windows) in IntelliJ installieren Sensei nachsensei suchen.

Im Repositorysensei des Secure Code Warrior finden Sie den Quellcode und die Rezepte für viele dieser Blog-Beiträge (einschließlich dieses Beitrags).

https://github.com/securecodewarrior/sensei-blog-examples

Erfahren Sie Sensei


Ressourcen anzeigen
Ressourcen anzeigen

Füllen Sie das folgende Formular aus, um den Bericht herunterzuladen.

Wir möchten Ihre Erlaubnis einholen, Ihnen Informationen über unsere Produkte und/oder relevante Themen zur Sicherheit von Codes zuzusenden. Wir werden Ihre personenbezogenen Daten stets mit größter Sorgfalt behandeln und sie niemals zu Marketingzwecken an andere Unternehmen verkaufen.

Einreichen
scw Erfolgssymbol
scw-Fehlersymbol
Um das Formular zu senden, aktivieren Sie bitte die „Analyse“-Cookies. Nach Abschluss können Sie diese wieder deaktivieren.

Java-Falle – Bitweise Operatoren und Boolesche Operatoren

„Java Gotcha“ – ein häufig auftretendes Fehlermuster, das leicht unbeabsichtigt implementiert werden kann.

Ein relativ einfaches Java-Problem, das unerwartet auftritt, ist die Verwendung von Bitoperatoren anstelle von booleschen Vergleichsoperatoren.

Wenn Sie beispielsweise eigentlich „&&“ schreiben wollten, könnte ein einfacher Eingabefehler dazu führen, dass stattdessen „&“ geschrieben wird.

Eine gängige Heuristik, die wir beim Überprüfen von Code gelernt haben, lautet:

> Die Verwendung von „&“ oder „|“ in einer Bedingungsanweisung ist möglicherweise unbeabsichtigt.

In diesem Blogbeitrag werden wir heuristische Methoden untersuchen und Wege zur Erkennung und Behebung dieses Codierungsproblems aufzeigen.


Wo liegt das Problem? Mit Booleschen Operationen kann die Bitweise Operation normal durchgeführt werden.


Die Verwendung von Bitoperatoren mit booleschen Werten ist völlig zulässig, daher meldet Java keinen Syntaxfehler.

Wenn ich einen JUnit-Test erstelle, um die Wahrheitstabelle für bitweise ODER- (|) und bitweise UND-Operationen (&) zu untersuchen, werden wir feststellen, dass die Ausgabe der bitweisen Operatoren mit der Wahrheitstabelle übereinstimmt. Angesichts dessen könnten wir zu dem Schluss kommen, dass die Verwendung von bitweisen Operatoren kein Problem darstellt.

UND 真相表

Drei Spalten, eine mit a, eine mit b und die letzte mit (a^b)


@Test
void 按位运算符和 TruthTable () {
assertions.asserteQuals(真、真和真);
assertions.asserteQuals(假、对和错);
assertions.asserteQuals(假、假和真);
assertions.asserteQuals(假、假和假);
}


Der Test wurde bestanden, dies ist vollständig gültiges Java.


OR 真相表


Drei Spalten, eine mit a, eine mit b und die letzte mit (a v b)


@Test
void BitwiseOperatorOrTruthTable() {
assertions.asserteQuals(true, true | true);
assertions.asserteQuals(true, true | false);
assertions.asserteQuals(true, false | true);
assertions.asserteQuals(false, false | false);
}


Dieser Test wurde ebenfalls bestanden. Warum bevorzugen wir „&&“ und „||“?


Die Wahrheitstabelle ist ein mit dem Wahrheitstabellen-Tool von web.standfor.eduerstellt.


Problem: Kurzschlussbetrieb


Das eigentliche Problem ist der Unterschied im Verhalten zwischen Bitoperationen (&, |) und Booleschen Operatoren (&&, ||).

Boolesche Operatoren sind Kurzschlussoperatoren und werden nur bei Bedarf ausgewertet.

例如

if (args!= null & args.length () > 23) {
system.out.println (args);
}


Im obigen Code werden beide booleschen Bedingungen ausgewertet, da der Bitweise-Operator verwendet wird:

  • args!= leerer Wert
  • args.length () > 23

Wenn args leer ist, besteht für meinen Code das Risiko einer NullPointerException, da wir args.length immer überprüfen, auch wenn der Parameter leer ist, da zwei boolesche Bedingungen ausgewertet werden müssen.


Boolesche Operatoren mit Kurzschlussauswertung


Bei Verwendung von &&, zum Beispiel

if (args!= null && args.length () > 23) {
system.out.println (args);
}


Sobald wir wissen, dass args != null, ist das Ergebnis false und die Berechnung der Bedingungsausdrücke wird beendet.

Wir brauchen die rechte Seite nicht zu bewerten.

Unabhängig vom Ergebnis der rechten Bedingung ist der endgültige Wert des booleschen Ausdrucks immer falsch.


Aber das wird im Produktionscode niemals passieren.


Dies ist ein leicht zu begehender Fehler, den statische Analysewerkzeuge nicht immer machen.

Ich habe die folgenden Google-Dork-Suchbegriffe verwendet, um zu sehen, ob ich öffentliche Beispiele für dieses Muster finden kann:

Dateityp: java if „!=null &”
Diese Suche hat in rootwindowContainer einige Codes aus Android gefunden.
isDocument = intent != null & intent.isDocument ()


Dieser Code könnte die Codeüberprüfung passieren, da wir häufig Bitoperatoren in Zuweisungsanweisungen verwenden, um Werte zu maskieren. In diesem Fall ist das Ergebnis jedoch dasselbe wie im obigen Beispiel mit der if-Anweisung. Wenn intent immer leer ist, wird eine NullPointerException ausgelöst.

Wir entkommen dieser Struktur oft, weil wir häufig defensiv programmieren und redundanten Code schreiben. Die Überprüfung „!= null“ ist in den meisten Anwendungsfällen wahrscheinlich überflüssig.

Dies ist ein Fehler, den Programmierer beim Erstellen von Code machen.

Ich weiß nicht, wie aktuell die Suchergebnisse sind, aber als ich eine Suche durchgeführt habe, stammten die zurückgegebenen Codes von: Google, Amazon, Apache... und mir.

Die jüngsten Pull-Anfragen in einem meiner Open-Source-Projekte dienen genau dazu, diesen Fehler zu beheben.

if (键入!=null & type.trim () .length () >0) {
AcceptMediatypeDefinitionsList.add (type.trim ());
}


Wie finde ich das?


Als ich meinen Beispielcode in mehreren statischen Analysatoren überprüfte, haben sie diesen versteckten Selbstzerstörungscode nicht entdeckt.

Als Team Secure Code Warrior haben wir eine relativ einfache Sensei erstellt und überprüft, mit der dieses Problem gelöst werden kann.

Da Bitoperatoren sehr leistungsfähig sind und häufig für Zuweisungen verwendet werden, haben wir uns auf Anwendungsfälle von if-Anweisungen und die Verwendung von Bitwise & konzentriert, um problematischen Code zu finden.

搜索:
表情:
AnyOF:
-在:
条件:{}
价值:
区分大小写:假
匹配:“.* &。*”


Wenn es als Bedingungsausdruck verwendet wird, verwendet es reguläre Ausdrücke, um „&“ abzugleichen. Zum Beispiel in einer if-Anweisung.

Um dieses Problem zu beheben, greifen wir erneut auf reguläre Ausdrücke zurück. Diesmal verwenden wir die sed-Funktion in QuickFix, um & im Ausdruck global durch && zu ersetzen.

Verfügbare Korrektur:
- Name: „Bitweises AND-Operator durch logisches AND-Operator ersetzen”
Aktion:
- Überschreiben:
Ändern in: „{{#sed}} s/&/&&&g,{{{.}}} {{/sed}}”


Fußnote

Dies deckt den häufigsten Missbrauch von Bitoperatoren ab, nämlich die tatsächliche Verwendung von Booleschen Operatoren.

In anderen Fällen kann dies vorkommen, beispielsweise bei Aufgabenbeispielen, aber beim Erstellen von Rezepten müssen wir falsch-positive Erkennungen so weit wie möglich vermeiden, da die Rezepte sonst ignoriert oder geschlossen werden. Wir erstellen Rezepte, die den häufigsten Fällen entsprechen. Mit der Weiterentwicklung von Sensei werden wir wahrscheinlich zusätzliche Spezifitäten in die Suchfunktion integrieren, um mehr Übereinstimmungsbedingungen abzudecken.

In der aktuellen Form wird diese Formel viele praktische Anwendungsfälle erkennen, vor allemden in meinem Projekt beschriebenen.

Hinweis: Viele Code-Helden haben zu diesem Beispiel und der Überprüfung des Rezepts beigetragen – Charlie Erikson, Matthew Carley, Robin Clairhout, Bryson Ax, Nathan Desmet und Donny Robershoten. Vielen Dank für eure Hilfe.


---


Sie können Sensei über „Einstellungen\Plugins“ (Mac) oder „Einstellungen\Plugins“ (Windows) in IntelliJ installieren Sensei nachsensei suchen.

Im Repositorysensei des Secure Code Warrior finden Sie den Quellcode und die Rezepte für viele dieser Blog-Beiträge (einschließlich dieses Beitrags).

https://github.com/securecodewarrior/sensei-blog-examples

Erfahren Sie Sensei


Webinar ansehen
Fangen wir an.
mehr erfahren

Klicken Sie auf den folgenden Link und laden Sie die PDF-Datei dieser Ressource herunter.

Secure Code Warrior kann Ihrem Unternehmen dabei helfen, Code während des gesamten Softwareentwicklungszyklus zu schützen und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, Chief Information Security Officer oder in einem anderen sicherheitsrelevanten Bereich tätig sind – wir können Ihrem Unternehmen dabei helfen, die mit unsicherem Code verbundenen Risiken zu minimieren.

Bericht anzeigenDemo buchen
Ressourcen anzeigen
Teilen auf:
LinkedIn-MarkenSozialx Logo
Interessiert an mehr?

Teilen auf:
LinkedIn-MarkenSozialx Logo
作者
Alan Richardson
Veröffentlicht Feb 07, 2021

Alan Richardson verfügt über mehr als zwanzig Jahre Berufserfahrung in der IT-Branche. Er arbeitete als Entwickler und auf jeder Ebene der Testhierarchie, vom Tester bis hin zum Head of Testing. Als Head of Developer Relations bei Secure Code Warrior arbeitet er direkt mit Teams zusammen, um die Entwicklung von hochwertigem, sicherem Code zu verbessern. Alan ist der Autor von vier Büchern, darunter "Dear Evil Tester" und "Java For Testers". Alan hat auch Online-Schulungen courses erstellt, um Menschen beim Erlernen von technischen Web-Tests und Selenium WebDriver mit Java zu helfen. Alan veröffentlicht seine Schriften und Schulungsvideos auf SeleniumSimplified.com, EvilTester.com, JavaForTesters.com und CompendiumDev.co.uk.

Teilen auf:
LinkedIn-MarkenSozialx Logo

Java-Falle – Bitweise Operatoren und Boolesche Operatoren

„Java Gotcha“ – ein häufig auftretendes Fehlermuster, das leicht unbeabsichtigt implementiert werden kann.

Ein relativ einfaches Java-Problem, das unerwartet auftritt, ist die Verwendung von Bitoperatoren anstelle von booleschen Vergleichsoperatoren.

Wenn Sie beispielsweise eigentlich „&&“ schreiben wollten, könnte ein einfacher Eingabefehler dazu führen, dass stattdessen „&“ geschrieben wird.

Eine gängige Heuristik, die wir beim Überprüfen von Code gelernt haben, lautet:

> Die Verwendung von „&“ oder „|“ in einer Bedingungsanweisung ist möglicherweise unbeabsichtigt.

In diesem Blogbeitrag werden wir heuristische Methoden untersuchen und Wege zur Erkennung und Behebung dieses Codierungsproblems aufzeigen.


Wo liegt das Problem? Mit Booleschen Operationen kann die Bitweise Operation normal durchgeführt werden.


Die Verwendung von Bitoperatoren mit booleschen Werten ist völlig zulässig, daher meldet Java keinen Syntaxfehler.

Wenn ich einen JUnit-Test erstelle, um die Wahrheitstabelle für bitweise ODER- (|) und bitweise UND-Operationen (&) zu untersuchen, werden wir feststellen, dass die Ausgabe der bitweisen Operatoren mit der Wahrheitstabelle übereinstimmt. Angesichts dessen könnten wir zu dem Schluss kommen, dass die Verwendung von bitweisen Operatoren kein Problem darstellt.

UND 真相表

Drei Spalten, eine mit a, eine mit b und die letzte mit (a^b)


@Test
void 按位运算符和 TruthTable () {
assertions.asserteQuals(真、真和真);
assertions.asserteQuals(假、对和错);
assertions.asserteQuals(假、假和真);
assertions.asserteQuals(假、假和假);
}


Der Test wurde bestanden, dies ist vollständig gültiges Java.


OR 真相表


Drei Spalten, eine mit a, eine mit b und die letzte mit (a v b)


@Test
void BitwiseOperatorOrTruthTable() {
assertions.asserteQuals(true, true | true);
assertions.asserteQuals(true, true | false);
assertions.asserteQuals(true, false | true);
assertions.asserteQuals(false, false | false);
}


Dieser Test wurde ebenfalls bestanden. Warum bevorzugen wir „&&“ und „||“?


Die Wahrheitstabelle ist ein mit dem Wahrheitstabellen-Tool von web.standfor.eduerstellt.


Problem: Kurzschlussbetrieb


Das eigentliche Problem ist der Unterschied im Verhalten zwischen Bitoperationen (&, |) und Booleschen Operatoren (&&, ||).

Boolesche Operatoren sind Kurzschlussoperatoren und werden nur bei Bedarf ausgewertet.

例如

if (args!= null & args.length () > 23) {
system.out.println (args);
}


Im obigen Code werden beide booleschen Bedingungen ausgewertet, da der Bitweise-Operator verwendet wird:

  • args!= leerer Wert
  • args.length () > 23

Wenn args leer ist, besteht für meinen Code das Risiko einer NullPointerException, da wir args.length immer überprüfen, auch wenn der Parameter leer ist, da zwei boolesche Bedingungen ausgewertet werden müssen.


Boolesche Operatoren mit Kurzschlussauswertung


Bei Verwendung von &&, zum Beispiel

if (args!= null && args.length () > 23) {
system.out.println (args);
}


Sobald wir wissen, dass args != null, ist das Ergebnis false und die Berechnung der Bedingungsausdrücke wird beendet.

Wir brauchen die rechte Seite nicht zu bewerten.

Unabhängig vom Ergebnis der rechten Bedingung ist der endgültige Wert des booleschen Ausdrucks immer falsch.


Aber das wird im Produktionscode niemals passieren.


Dies ist ein leicht zu begehender Fehler, den statische Analysewerkzeuge nicht immer machen.

Ich habe die folgenden Google-Dork-Suchbegriffe verwendet, um zu sehen, ob ich öffentliche Beispiele für dieses Muster finden kann:

Dateityp: java if „!=null &”
Diese Suche hat in rootwindowContainer einige Codes aus Android gefunden.
isDocument = intent != null & intent.isDocument ()


Dieser Code könnte die Codeüberprüfung passieren, da wir häufig Bitoperatoren in Zuweisungsanweisungen verwenden, um Werte zu maskieren. In diesem Fall ist das Ergebnis jedoch dasselbe wie im obigen Beispiel mit der if-Anweisung. Wenn intent immer leer ist, wird eine NullPointerException ausgelöst.

Wir entkommen dieser Struktur oft, weil wir häufig defensiv programmieren und redundanten Code schreiben. Die Überprüfung „!= null“ ist in den meisten Anwendungsfällen wahrscheinlich überflüssig.

Dies ist ein Fehler, den Programmierer beim Erstellen von Code machen.

Ich weiß nicht, wie aktuell die Suchergebnisse sind, aber als ich eine Suche durchgeführt habe, stammten die zurückgegebenen Codes von: Google, Amazon, Apache... und mir.

Die jüngsten Pull-Anfragen in einem meiner Open-Source-Projekte dienen genau dazu, diesen Fehler zu beheben.

if (键入!=null & type.trim () .length () >0) {
AcceptMediatypeDefinitionsList.add (type.trim ());
}


Wie finde ich das?


Als ich meinen Beispielcode in mehreren statischen Analysatoren überprüfte, haben sie diesen versteckten Selbstzerstörungscode nicht entdeckt.

Als Team Secure Code Warrior haben wir eine relativ einfache Sensei erstellt und überprüft, mit der dieses Problem gelöst werden kann.

Da Bitoperatoren sehr leistungsfähig sind und häufig für Zuweisungen verwendet werden, haben wir uns auf Anwendungsfälle von if-Anweisungen und die Verwendung von Bitwise & konzentriert, um problematischen Code zu finden.

搜索:
表情:
AnyOF:
-在:
条件:{}
价值:
区分大小写:假
匹配:“.* &。*”


Wenn es als Bedingungsausdruck verwendet wird, verwendet es reguläre Ausdrücke, um „&“ abzugleichen. Zum Beispiel in einer if-Anweisung.

Um dieses Problem zu beheben, greifen wir erneut auf reguläre Ausdrücke zurück. Diesmal verwenden wir die sed-Funktion in QuickFix, um & im Ausdruck global durch && zu ersetzen.

Verfügbare Korrektur:
- Name: „Bitweises AND-Operator durch logisches AND-Operator ersetzen”
Aktion:
- Überschreiben:
Ändern in: „{{#sed}} s/&/&&&g,{{{.}}} {{/sed}}”


Fußnote

Dies deckt den häufigsten Missbrauch von Bitoperatoren ab, nämlich die tatsächliche Verwendung von Booleschen Operatoren.

In anderen Fällen kann dies vorkommen, beispielsweise bei Aufgabenbeispielen, aber beim Erstellen von Rezepten müssen wir falsch-positive Erkennungen so weit wie möglich vermeiden, da die Rezepte sonst ignoriert oder geschlossen werden. Wir erstellen Rezepte, die den häufigsten Fällen entsprechen. Mit der Weiterentwicklung von Sensei werden wir wahrscheinlich zusätzliche Spezifitäten in die Suchfunktion integrieren, um mehr Übereinstimmungsbedingungen abzudecken.

In der aktuellen Form wird diese Formel viele praktische Anwendungsfälle erkennen, vor allemden in meinem Projekt beschriebenen.

Hinweis: Viele Code-Helden haben zu diesem Beispiel und der Überprüfung des Rezepts beigetragen – Charlie Erikson, Matthew Carley, Robin Clairhout, Bryson Ax, Nathan Desmet und Donny Robershoten. Vielen Dank für eure Hilfe.


---


Sie können Sensei über „Einstellungen\Plugins“ (Mac) oder „Einstellungen\Plugins“ (Windows) in IntelliJ installieren Sensei nachsensei suchen.

Im Repositorysensei des Secure Code Warrior finden Sie den Quellcode und die Rezepte für viele dieser Blog-Beiträge (einschließlich dieses Beitrags).

https://github.com/securecodewarrior/sensei-blog-examples

Erfahren Sie Sensei


Verzeichnis

PDF herunterladen
Ressourcen anzeigen
Interessiert an mehr?

Alan Richardson verfügt über mehr als zwanzig Jahre Berufserfahrung in der IT-Branche. Er arbeitete als Entwickler und auf jeder Ebene der Testhierarchie, vom Tester bis hin zum Head of Testing. Als Head of Developer Relations bei Secure Code Warrior arbeitet er direkt mit Teams zusammen, um die Entwicklung von hochwertigem, sicherem Code zu verbessern. Alan ist der Autor von vier Büchern, darunter "Dear Evil Tester" und "Java For Testers". Alan hat auch Online-Schulungen courses erstellt, um Menschen beim Erlernen von technischen Web-Tests und Selenium WebDriver mit Java zu helfen. Alan veröffentlicht seine Schriften und Schulungsvideos auf SeleniumSimplified.com, EvilTester.com, JavaForTesters.com und CompendiumDev.co.uk.

mehr erfahren

Secure Code Warrior kann Ihrem Unternehmen dabei helfen, Code während des gesamten Softwareentwicklungszyklus zu schützen und eine Kultur zu schaffen, in der Cybersicherheit an erster Stelle steht. Ganz gleich, ob Sie AppSec-Manager, Entwickler, Chief Information Security Officer oder in einem anderen sicherheitsrelevanten Bereich tätig sind – wir können Ihrem Unternehmen dabei helfen, die mit unsicherem Code verbundenen Risiken zu minimieren.

Demo buchen下载
Teilen auf:
LinkedIn-MarkenSozialx Logo
Ressourcenzentrum

Ressourcen, die Ihnen den Einstieg erleichtern

Weitere Beiträge
Ressourcenzentrum

Ressourcen, die Ihnen den Einstieg erleichtern

Weitere Beiträge