
Java-Falle – Bitweise Operatoren und Boolesche Operatoren
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 真相表

@Test
void 按位运算符和 TruthTable () {
assertions.asserteQuals(真、真和真);
assertions.asserteQuals(假、对和错);
assertions.asserteQuals(假、假和真);
assertions.asserteQuals(假、假和假);
}
Der Test wurde bestanden, dies ist vollständig gültiges Java.
OR 真相表

@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
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 .
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.

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 buchenAlan 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.
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 真相表

@Test
void 按位运算符和 TruthTable () {
assertions.asserteQuals(真、真和真);
assertions.asserteQuals(假、对和错);
assertions.asserteQuals(假、假和真);
assertions.asserteQuals(假、假和假);
}
Der Test wurde bestanden, dies ist vollständig gültiges Java.
OR 真相表

@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
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 真相表

@Test
void 按位运算符和 TruthTable () {
assertions.asserteQuals(真、真和真);
assertions.asserteQuals(假、对和错);
assertions.asserteQuals(假、假和真);
assertions.asserteQuals(假、假和假);
}
Der Test wurde bestanden, dies ist vollständig gültiges Java.
OR 真相表

@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

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 buchenAlan 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.
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 真相表

@Test
void 按位运算符和 TruthTable () {
assertions.asserteQuals(真、真和真);
assertions.asserteQuals(假、对和错);
assertions.asserteQuals(假、假和真);
assertions.asserteQuals(假、假和假);
}
Der Test wurde bestanden, dies ist vollständig gültiges Java.
OR 真相表

@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
Verzeichnis
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.

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下载Ressourcen, die Ihnen den Einstieg erleichtern
Themen und Inhalte der Sicherheitsschulung
Unsere branchenführenden Inhalte werden ständig weiterentwickelt, um sich an die sich wandelnde Softwareentwicklungslandschaft anzupassen und gleichzeitig Ihre Rolle zu berücksichtigen. Die Themen reichen von KI bis hin zu XQuery-Injection und sind für verschiedene Positionen geeignet, von Architekten und Ingenieuren bis hin zu Produktmanagern und QA-Mitarbeitern. Verschaffen Sie sich einen ersten Überblick nach Themen und Rollen und erfahren Sie, was unser Inhaltsverzeichnis zu bieten hat.
Die Kamer van Koophandel setzt Maßstäbe für entwicklergesteuerte Sicherheit in großem Maßstab
Die Kamer van Koophandel berichtet, wie sie sicheres Codieren durch rollenbasierte Zertifizierungen, Trust Score-Benchmarking und eine Kultur der gemeinsamen Verantwortung für Sicherheit in die tägliche Entwicklungsarbeit integriert hat.
Bedrohungsmodellierung mit KI: So wird jeder Entwickler zum Bedrohungsmodellierer
Sie werden besser gerüstet sein, um Entwicklern dabei zu helfen, Ideen und Techniken zur Bedrohungsmodellierung mit den KI-Tools zu kombinieren, die sie bereits verwenden, um die Sicherheit zu erhöhen, die Zusammenarbeit zu verbessern und von Anfang an widerstandsfähigere Software zu entwickeln.
Ressourcen, die Ihnen den Einstieg erleichtern
Cybermon ist zurück: Die KI-Mission zum Besiegen des Bosses ist jetzt auf Abruf verfügbar.
Cybermon 2025: Der Kampf gegen den Boss hat nun in SCW ganzjährig begonnen. Der Kampf um die Sicherheit von KI/LLM auf Stammesebene, die Entwicklung von Sicherheits-KI wird durch groß angelegte Modelle verstärkt.
Auslegung des Gesetzes zur Netzresilienz: Was bedeutet es, durch die Entwicklung von Design-Software Sicherheit zu erreichen?
Verstehen Sie die Anforderungen des EU-Gesetzes zur Netzresilienz (CRA), für wen es gilt und wie sich Ingenieurteams durch Designpraktiken, Schwachstellenprävention und Kompetenzaufbau für Entwickler darauf vorbereiten können.
Treibende Faktoren 1: Klare und messbare Erfolgskriterien
Enabler 1 ist der Auftakt zu unserer 10-teiligen Reihe über Erfolgsfaktoren. Er zeigt, wie sichere Codierung mit Geschäftsergebnissen wie Risikominderung und schnellerer Reifung langfristiger Pläne in Verbindung gebracht werden kann.




%20(1).avif)
.avif)
