
Javaの落とし穴 - ビット単位演算子またはブール演算子
Javaの落とし穴 - ビット単位演算子またはブール演算子
「Javaの落とし穴」- 誤って実装しやすい典型的なエラーパターン。
Javaでうっかり陥りやすい罠の一つは、ブール比較演算子の代わりにビット単位演算子を使用してしまうことです。
例えば、単純な入力ミスにより、本来「&&」と入力したかったのに「&」と入力してしまう可能性があります。
コードレビューで学ぶ一般的なヒューリスティックは以下の通りです:
条件文で使用される「&」または「|」はおそらく意図されていません。
このブログ記事では、ヒューリスティックを探求し、このコーディングの問題を特定し解決する方法を明らかにします。
問題は何ですか? ビット単位の演算はブール値で正しく動作します
ブール値に対するビット演算子の使用は完全に有効です。したがって、Javaは構文エラーを報告しません。
ビット単位の論理和(|)とビット単位の論理積(&)の両方について真理値表を探索するJUnitテストを作成すると、ビット単位演算子の出力が真理値表と一致することがわかります。このことから、ビット単位演算子の使用は問題ないと思われるかもしれません。
ET 真値表

@Test
annulez BitwiseOperatorsAndTruthTable () {
assertions.assertEquals (vrai, vrai et vrai) ;
Assertions.assertEquals (faux, vrai et faux) ;
Assertions.assertEquals (faux, faux et vrai) ;
Assertions.assertEquals (faux, faux et faux) ;
}
テストは成功しました。これは完全に有効なJavaです。
OR真理値表

@Test
annulez BitwiseOperatorsorTruthTable () {
assertions.assertEquals (vrai, vrai | vrai) ;
Assertions.assertEquals (vrai, vrai | faux) ;
Assertions.assertEquals (vrai, faux | vrai) ;
Assertions.assertEquals (faux, faux | faux) ;
}
このテストも通るが、なぜ「&&」と「||」を好むのか?
真理値表の画像は 真理値表ツール を使用して作成されました web.standfor.eduから作成されました。
問題:短絡動作
真の問題は、ビット単位演算子(&, |)とブール演算子(&&, ||)の挙動の違いにある。
ブール演算子は、必要な部分のみを評価するショートカット演算子です。
例えば
si (args) ! = null et args.length () > 23) {
System.out.println (args) ;
}
上記のコードでは、ビット演算子が使用されているため、2つのブール条件が評価されます:
- ぼろきれ!=ダメ
- args.length() > 23
これにより、argsがnullの場合にNullPointerExceptionが発生する可能性があります。なぜなら、argsがnullであってもargs.lengthの検証は常に実行されるためです。両方のブール条件が評価される必要があるからです。
ブール演算子による短絡評価
&& が使用される場合、例えば
si (args) ! = null && args.length () > 23) {
System.out.println (args) ;
}
これを理解したら、Args! = null は条件式の評価が停止した時点で False の値を返します。
右側を評価する必要はありません。
右辺の条件の結果がどうであれ、ブール式の最終的な値は偽となる。
しかし、本番コードでは決して起こらない
これは比較的起こりやすいエラーであり、静的解析ツールでは必ずしも検出されない。
このモデルの公開例を見つけられるかどうか確認するために、次のGoogle Dorkを使用しました:
ファイルタイプ:java si「! =null &」
この検索により、RootWindowContainerからAndroidコードが取得されました
IsDocument = intention ! = null et Intent.isDocument ()
この種のコードはコードレビューを通過する可能性があります。値を隠蔽するために代入文でビット演算子を頻繁に使用するためです。しかしこの場合、結果は上記のif文の例と同じです。意図がnullの場合、NullPointerExceptionがスローされます。
非常に頻繁に、この構文で済ませてしまうのは、防御的なコーディングを心がけ、冗長なコードを書く傾向があるためです。!= null のチェックは、ほとんどのユースケースにおいて冗長と言えるでしょう。
これはプログラマーが本番コードで犯したミスです。
検索結果が最新かどうかは分かりませんが、私が実行した際には、Google、Amazon、Apache...および私自身のコードを含む結果が返されました。
私のオープンソースプロジェクトの一つで最近寄せられた抽出リクエストは、まさにこのエラーを修正するものでした。
si (tapez ! =null et tapez .trim () .length () >0) {
AcceptMediaTypeDefinitionsList.add (type.trim ()) ;
}
どうやって見つけるか
いくつかの静的解析ツールで私のサンプルコードを確認したところ、いずれのツールもこの隠された自己破壊コードを検出できませんでした。
Secure Code Warriorとして、この問題に対応できるSensei を作成・改訂しました。
ビット演算子は完全に有効であり、代入文で頻繁に使用されるため、問題のあるコードを見つけるために、if文のユースケースとビット演算子&の使用に焦点を当てた。
recherche :
expression :
N'importe lequel des :
- dans :
état : {}
valeur :
CaseSensitive : faux
correspond à : « .* » et . * »
これは正規表現を使用して、「&」が条件式として使用される場合(例えばif文内)に一致させます。
この問題を解決するため、再び正規表現に頼りました。今回はQuickFixのsed機能を使用し、式内の&を&&に一括置換します。
Correctifs disponibles :
- nom : « Remplacer l'opérateur AND au niveau du bit par l'opérateur ET logique »
actions :
- réécrire :
à : « {{#sed}} s/&/&&/g, {{{.}}} {{/sed}} »
終章の注記
これはビット演算子の最も一般的な誤用、つまり実際にはブール演算子が意図されていた場合をカバーします。
他の状況では、例えば割り当ての例のように発生する可能性がありますが、レシピ作成時には誤検知を避けるよう努める必要があります。さもなければレシピが無視されたり無効化されたりします。私たちは最も一般的な事象に対応するレシピを作成しています。Sensei、検索機能にさらなる特異性を追加し、より多くの条件をカバーできるようにする可能性があります。
現在の形で、このレシピは多くの現在のユースケースを特定でき、最も重要なのは、私のプロジェクトで報告されたユースケースである。
注記:このレシピの例とレビューには、多くのコード専門家が貢献しました:Charlie Eriksen、Matthieu Calie、Robin Claerhaut、Brysen Ackx、Nathan Desmet、Downey Robersscheuten。ご協力に感謝します。
---
IntelliJSensei をインストールするには、「環境設定 \ プラグイン」(Mac)または「設定 \ プラグイン」(Windows)を使用し、「Sensei Code」を検索してください。
Secure Code Warriorにある「sensei」リポジトリには、これらのブログ記事(この記事も含む)のソースコードやレシピが多数用意されています。
https://github.com/securecodewarrior/sensei-blog-examples
このブログ記事では、Javaコーディングにおけるよくあるミス(条件演算子の代わりにビット演算子を使用すること)と、それがコードに生み出す脆弱性、Sensei 問題をSensei 検証します。
Alan Richardson possède plus de vingt ans d'expérience professionnelle en informatique. Il a travaillé en tant que développeur et a occupé tous les niveaux de la hiérarchie des tests, du testeur au responsable des tests. Responsable des relations avec les développeurs chez Secure Code Warrior, il travaille directement avec les équipes, pour améliorer le développement d'un code sécurisé de qualité. Alan est l'auteur de quatre livres, dont « Dear Evil Tester » et « Java For Testers ». Alan a également créé des cours de formation en ligne pour aider les utilisateurs à apprendre les tests techniques sur le Web et Selenium WebDriver avec Java. Alan publie ses vidéos d'écriture et de formation sur SeleniumSimplified.com, EvilTester.com, JavaForTesters.com et CompendiumDev.co.uk.

Secure Code Warrior ソフトウェア開発ライフサイクル全体を通じてコードのセキュリティを確保し、サイバーセキュリティを最優先事項とする文化を構築するために、組織をSecure Code Warrior 。アプリケーションセキュリティ担当者、開発者、情報セキュリティ責任者、その他セキュリティに関わるあらゆる方々のために、当社は組織が非セキュアなコードに関連するリスクを軽減するお手伝いをいたします。
デモを予約するAlan Richardson possède plus de vingt ans d'expérience professionnelle en informatique. Il a travaillé en tant que développeur et a occupé tous les niveaux de la hiérarchie des tests, du testeur au responsable des tests. Responsable des relations avec les développeurs chez Secure Code Warrior, il travaille directement avec les équipes, pour améliorer le développement d'un code sécurisé de qualité. Alan est l'auteur de quatre livres, dont « Dear Evil Tester » et « Java For Testers ». Alan a également créé des cours de formation en ligne pour aider les utilisateurs à apprendre les tests techniques sur le Web et Selenium WebDriver avec Java. Alan publie ses vidéos d'écriture et de formation sur SeleniumSimplified.com, EvilTester.com, JavaForTesters.com et CompendiumDev.co.uk.
Javaの落とし穴 - ビット単位演算子またはブール演算子
「Javaの落とし穴」- 誤って実装しやすい典型的なエラーパターン。
Javaでうっかり陥りやすい罠の一つは、ブール比較演算子の代わりにビット単位演算子を使用してしまうことです。
例えば、単純な入力ミスにより、本来「&&」と入力したかったのに「&」と入力してしまう可能性があります。
コードレビューで学ぶ一般的なヒューリスティックは以下の通りです:
条件文で使用される「&」または「|」はおそらく意図されていません。
このブログ記事では、ヒューリスティックを探求し、このコーディングの問題を特定し解決する方法を明らかにします。
問題は何ですか? ビット単位の演算はブール値で正しく動作します
ブール値に対するビット演算子の使用は完全に有効です。したがって、Javaは構文エラーを報告しません。
ビット単位の論理和(|)とビット単位の論理積(&)の両方について真理値表を探索するJUnitテストを作成すると、ビット単位演算子の出力が真理値表と一致することがわかります。このことから、ビット単位演算子の使用は問題ないと思われるかもしれません。
ET 真値表

@Test
annulez BitwiseOperatorsAndTruthTable () {
assertions.assertEquals (vrai, vrai et vrai) ;
Assertions.assertEquals (faux, vrai et faux) ;
Assertions.assertEquals (faux, faux et vrai) ;
Assertions.assertEquals (faux, faux et faux) ;
}
テストは成功しました。これは完全に有効なJavaです。
OR真理値表

@Test
annulez BitwiseOperatorsorTruthTable () {
assertions.assertEquals (vrai, vrai | vrai) ;
Assertions.assertEquals (vrai, vrai | faux) ;
Assertions.assertEquals (vrai, faux | vrai) ;
Assertions.assertEquals (faux, faux | faux) ;
}
このテストも通るが、なぜ「&&」と「||」を好むのか?
真理値表の画像は 真理値表ツール を使用して作成されました web.standfor.eduから作成されました。
問題:短絡動作
真の問題は、ビット単位演算子(&, |)とブール演算子(&&, ||)の挙動の違いにある。
ブール演算子は、必要な部分のみを評価するショートカット演算子です。
例えば
si (args) ! = null et args.length () > 23) {
System.out.println (args) ;
}
上記のコードでは、ビット演算子が使用されているため、2つのブール条件が評価されます:
- ぼろきれ!=ダメ
- args.length() > 23
これにより、argsがnullの場合にNullPointerExceptionが発生する可能性があります。なぜなら、argsがnullであってもargs.lengthの検証は常に実行されるためです。両方のブール条件が評価される必要があるからです。
ブール演算子による短絡評価
&& が使用される場合、例えば
si (args) ! = null && args.length () > 23) {
System.out.println (args) ;
}
これを理解したら、Args! = null は条件式の評価が停止した時点で False の値を返します。
右側を評価する必要はありません。
右辺の条件の結果がどうであれ、ブール式の最終的な値は偽となる。
しかし、本番コードでは決して起こらない
これは比較的起こりやすいエラーであり、静的解析ツールでは必ずしも検出されない。
このモデルの公開例を見つけられるかどうか確認するために、次のGoogle Dorkを使用しました:
ファイルタイプ:java si「! =null &」
この検索により、RootWindowContainerからAndroidコードが取得されました
IsDocument = intention ! = null et Intent.isDocument ()
この種のコードはコードレビューを通過する可能性があります。値を隠蔽するために代入文でビット演算子を頻繁に使用するためです。しかしこの場合、結果は上記のif文の例と同じです。意図がnullの場合、NullPointerExceptionがスローされます。
非常に頻繁に、この構文で済ませてしまうのは、防御的なコーディングを心がけ、冗長なコードを書く傾向があるためです。!= null のチェックは、ほとんどのユースケースにおいて冗長と言えるでしょう。
これはプログラマーが本番コードで犯したミスです。
検索結果が最新かどうかは分かりませんが、私が実行した際には、Google、Amazon、Apache...および私自身のコードを含む結果が返されました。
私のオープンソースプロジェクトの一つで最近寄せられた抽出リクエストは、まさにこのエラーを修正するものでした。
si (tapez ! =null et tapez .trim () .length () >0) {
AcceptMediaTypeDefinitionsList.add (type.trim ()) ;
}
どうやって見つけるか
いくつかの静的解析ツールで私のサンプルコードを確認したところ、いずれのツールもこの隠された自己破壊コードを検出できませんでした。
Secure Code Warriorとして、この問題に対応できるSensei を作成・改訂しました。
ビット演算子は完全に有効であり、代入文で頻繁に使用されるため、問題のあるコードを見つけるために、if文のユースケースとビット演算子&の使用に焦点を当てた。
recherche :
expression :
N'importe lequel des :
- dans :
état : {}
valeur :
CaseSensitive : faux
correspond à : « .* » et . * »
これは正規表現を使用して、「&」が条件式として使用される場合(例えばif文内)に一致させます。
この問題を解決するため、再び正規表現に頼りました。今回はQuickFixのsed機能を使用し、式内の&を&&に一括置換します。
Correctifs disponibles :
- nom : « Remplacer l'opérateur AND au niveau du bit par l'opérateur ET logique »
actions :
- réécrire :
à : « {{#sed}} s/&/&&/g, {{{.}}} {{/sed}} »
終章の注記
これはビット演算子の最も一般的な誤用、つまり実際にはブール演算子が意図されていた場合をカバーします。
他の状況では、例えば割り当ての例のように発生する可能性がありますが、レシピ作成時には誤検知を避けるよう努める必要があります。さもなければレシピが無視されたり無効化されたりします。私たちは最も一般的な事象に対応するレシピを作成しています。Sensei、検索機能にさらなる特異性を追加し、より多くの条件をカバーできるようにする可能性があります。
現在の形で、このレシピは多くの現在のユースケースを特定でき、最も重要なのは、私のプロジェクトで報告されたユースケースである。
注記:このレシピの例とレビューには、多くのコード専門家が貢献しました:Charlie Eriksen、Matthieu Calie、Robin Claerhaut、Brysen Ackx、Nathan Desmet、Downey Robersscheuten。ご協力に感謝します。
---
IntelliJSensei をインストールするには、「環境設定 \ プラグイン」(Mac)または「設定 \ プラグイン」(Windows)を使用し、「Sensei Code」を検索してください。
Secure Code Warriorにある「sensei」リポジトリには、これらのブログ記事(この記事も含む)のソースコードやレシピが多数用意されています。
https://github.com/securecodewarrior/sensei-blog-examples
Javaの落とし穴 - ビット単位演算子またはブール演算子
「Javaの落とし穴」- 誤って実装しやすい典型的なエラーパターン。
Javaでうっかり陥りやすい罠の一つは、ブール比較演算子の代わりにビット単位演算子を使用してしまうことです。
例えば、単純な入力ミスにより、本来「&&」と入力したかったのに「&」と入力してしまう可能性があります。
コードレビューで学ぶ一般的なヒューリスティックは以下の通りです:
条件文で使用される「&」または「|」はおそらく意図されていません。
このブログ記事では、ヒューリスティックを探求し、このコーディングの問題を特定し解決する方法を明らかにします。
問題は何ですか? ビット単位の演算はブール値で正しく動作します
ブール値に対するビット演算子の使用は完全に有効です。したがって、Javaは構文エラーを報告しません。
ビット単位の論理和(|)とビット単位の論理積(&)の両方について真理値表を探索するJUnitテストを作成すると、ビット単位演算子の出力が真理値表と一致することがわかります。このことから、ビット単位演算子の使用は問題ないと思われるかもしれません。
ET 真値表

@Test
annulez BitwiseOperatorsAndTruthTable () {
assertions.assertEquals (vrai, vrai et vrai) ;
Assertions.assertEquals (faux, vrai et faux) ;
Assertions.assertEquals (faux, faux et vrai) ;
Assertions.assertEquals (faux, faux et faux) ;
}
テストは成功しました。これは完全に有効なJavaです。
OR真理値表

@Test
annulez BitwiseOperatorsorTruthTable () {
assertions.assertEquals (vrai, vrai | vrai) ;
Assertions.assertEquals (vrai, vrai | faux) ;
Assertions.assertEquals (vrai, faux | vrai) ;
Assertions.assertEquals (faux, faux | faux) ;
}
このテストも通るが、なぜ「&&」と「||」を好むのか?
真理値表の画像は 真理値表ツール を使用して作成されました web.standfor.eduから作成されました。
問題:短絡動作
真の問題は、ビット単位演算子(&, |)とブール演算子(&&, ||)の挙動の違いにある。
ブール演算子は、必要な部分のみを評価するショートカット演算子です。
例えば
si (args) ! = null et args.length () > 23) {
System.out.println (args) ;
}
上記のコードでは、ビット演算子が使用されているため、2つのブール条件が評価されます:
- ぼろきれ!=ダメ
- args.length() > 23
これにより、argsがnullの場合にNullPointerExceptionが発生する可能性があります。なぜなら、argsがnullであってもargs.lengthの検証は常に実行されるためです。両方のブール条件が評価される必要があるからです。
ブール演算子による短絡評価
&& が使用される場合、例えば
si (args) ! = null && args.length () > 23) {
System.out.println (args) ;
}
これを理解したら、Args! = null は条件式の評価が停止した時点で False の値を返します。
右側を評価する必要はありません。
右辺の条件の結果がどうであれ、ブール式の最終的な値は偽となる。
しかし、本番コードでは決して起こらない
これは比較的起こりやすいエラーであり、静的解析ツールでは必ずしも検出されない。
このモデルの公開例を見つけられるかどうか確認するために、次のGoogle Dorkを使用しました:
ファイルタイプ:java si「! =null &」
この検索により、RootWindowContainerからAndroidコードが取得されました
IsDocument = intention ! = null et Intent.isDocument ()
この種のコードはコードレビューを通過する可能性があります。値を隠蔽するために代入文でビット演算子を頻繁に使用するためです。しかしこの場合、結果は上記のif文の例と同じです。意図がnullの場合、NullPointerExceptionがスローされます。
非常に頻繁に、この構文で済ませてしまうのは、防御的なコーディングを心がけ、冗長なコードを書く傾向があるためです。!= null のチェックは、ほとんどのユースケースにおいて冗長と言えるでしょう。
これはプログラマーが本番コードで犯したミスです。
検索結果が最新かどうかは分かりませんが、私が実行した際には、Google、Amazon、Apache...および私自身のコードを含む結果が返されました。
私のオープンソースプロジェクトの一つで最近寄せられた抽出リクエストは、まさにこのエラーを修正するものでした。
si (tapez ! =null et tapez .trim () .length () >0) {
AcceptMediaTypeDefinitionsList.add (type.trim ()) ;
}
どうやって見つけるか
いくつかの静的解析ツールで私のサンプルコードを確認したところ、いずれのツールもこの隠された自己破壊コードを検出できませんでした。
Secure Code Warriorとして、この問題に対応できるSensei を作成・改訂しました。
ビット演算子は完全に有効であり、代入文で頻繁に使用されるため、問題のあるコードを見つけるために、if文のユースケースとビット演算子&の使用に焦点を当てた。
recherche :
expression :
N'importe lequel des :
- dans :
état : {}
valeur :
CaseSensitive : faux
correspond à : « .* » et . * »
これは正規表現を使用して、「&」が条件式として使用される場合(例えばif文内)に一致させます。
この問題を解決するため、再び正規表現に頼りました。今回はQuickFixのsed機能を使用し、式内の&を&&に一括置換します。
Correctifs disponibles :
- nom : « Remplacer l'opérateur AND au niveau du bit par l'opérateur ET logique »
actions :
- réécrire :
à : « {{#sed}} s/&/&&/g, {{{.}}} {{/sed}} »
終章の注記
これはビット演算子の最も一般的な誤用、つまり実際にはブール演算子が意図されていた場合をカバーします。
他の状況では、例えば割り当ての例のように発生する可能性がありますが、レシピ作成時には誤検知を避けるよう努める必要があります。さもなければレシピが無視されたり無効化されたりします。私たちは最も一般的な事象に対応するレシピを作成しています。Sensei、検索機能にさらなる特異性を追加し、より多くの条件をカバーできるようにする可能性があります。
現在の形で、このレシピは多くの現在のユースケースを特定でき、最も重要なのは、私のプロジェクトで報告されたユースケースである。
注記:このレシピの例とレビューには、多くのコード専門家が貢献しました:Charlie Eriksen、Matthieu Calie、Robin Claerhaut、Brysen Ackx、Nathan Desmet、Downey Robersscheuten。ご協力に感謝します。
---
IntelliJSensei をインストールするには、「環境設定 \ プラグイン」(Mac)または「設定 \ プラグイン」(Windows)を使用し、「Sensei Code」を検索してください。
Secure Code Warriorにある「sensei」リポジトリには、これらのブログ記事(この記事も含む)のソースコードやレシピが多数用意されています。
https://github.com/securecodewarrior/sensei-blog-examples

以下のリンクをクリックして、このリソースのPDFをダウンロードしてください。
Secure Code Warrior ソフトウェア開発ライフサイクル全体を通じてコードのセキュリティを確保し、サイバーセキュリティを最優先事項とする文化を構築するために、組織をSecure Code Warrior 。アプリケーションセキュリティ担当者、開発者、情報セキュリティ責任者、その他セキュリティに関わるあらゆる方々のために、当社は組織が非セキュアなコードに関連するリスクを軽減するお手伝いをいたします。
レポートを表示するデモを予約するAlan Richardson possède plus de vingt ans d'expérience professionnelle en informatique. Il a travaillé en tant que développeur et a occupé tous les niveaux de la hiérarchie des tests, du testeur au responsable des tests. Responsable des relations avec les développeurs chez Secure Code Warrior, il travaille directement avec les équipes, pour améliorer le développement d'un code sécurisé de qualité. Alan est l'auteur de quatre livres, dont « Dear Evil Tester » et « Java For Testers ». Alan a également créé des cours de formation en ligne pour aider les utilisateurs à apprendre les tests techniques sur le Web et Selenium WebDriver avec Java. Alan publie ses vidéos d'écriture et de formation sur SeleniumSimplified.com, EvilTester.com, JavaForTesters.com et CompendiumDev.co.uk.
Javaの落とし穴 - ビット単位演算子またはブール演算子
「Javaの落とし穴」- 誤って実装しやすい典型的なエラーパターン。
Javaでうっかり陥りやすい罠の一つは、ブール比較演算子の代わりにビット単位演算子を使用してしまうことです。
例えば、単純な入力ミスにより、本来「&&」と入力したかったのに「&」と入力してしまう可能性があります。
コードレビューで学ぶ一般的なヒューリスティックは以下の通りです:
条件文で使用される「&」または「|」はおそらく意図されていません。
このブログ記事では、ヒューリスティックを探求し、このコーディングの問題を特定し解決する方法を明らかにします。
問題は何ですか? ビット単位の演算はブール値で正しく動作します
ブール値に対するビット演算子の使用は完全に有効です。したがって、Javaは構文エラーを報告しません。
ビット単位の論理和(|)とビット単位の論理積(&)の両方について真理値表を探索するJUnitテストを作成すると、ビット単位演算子の出力が真理値表と一致することがわかります。このことから、ビット単位演算子の使用は問題ないと思われるかもしれません。
ET 真値表

@Test
annulez BitwiseOperatorsAndTruthTable () {
assertions.assertEquals (vrai, vrai et vrai) ;
Assertions.assertEquals (faux, vrai et faux) ;
Assertions.assertEquals (faux, faux et vrai) ;
Assertions.assertEquals (faux, faux et faux) ;
}
テストは成功しました。これは完全に有効なJavaです。
OR真理値表

@Test
annulez BitwiseOperatorsorTruthTable () {
assertions.assertEquals (vrai, vrai | vrai) ;
Assertions.assertEquals (vrai, vrai | faux) ;
Assertions.assertEquals (vrai, faux | vrai) ;
Assertions.assertEquals (faux, faux | faux) ;
}
このテストも通るが、なぜ「&&」と「||」を好むのか?
真理値表の画像は 真理値表ツール を使用して作成されました web.standfor.eduから作成されました。
問題:短絡動作
真の問題は、ビット単位演算子(&, |)とブール演算子(&&, ||)の挙動の違いにある。
ブール演算子は、必要な部分のみを評価するショートカット演算子です。
例えば
si (args) ! = null et args.length () > 23) {
System.out.println (args) ;
}
上記のコードでは、ビット演算子が使用されているため、2つのブール条件が評価されます:
- ぼろきれ!=ダメ
- args.length() > 23
これにより、argsがnullの場合にNullPointerExceptionが発生する可能性があります。なぜなら、argsがnullであってもargs.lengthの検証は常に実行されるためです。両方のブール条件が評価される必要があるからです。
ブール演算子による短絡評価
&& が使用される場合、例えば
si (args) ! = null && args.length () > 23) {
System.out.println (args) ;
}
これを理解したら、Args! = null は条件式の評価が停止した時点で False の値を返します。
右側を評価する必要はありません。
右辺の条件の結果がどうであれ、ブール式の最終的な値は偽となる。
しかし、本番コードでは決して起こらない
これは比較的起こりやすいエラーであり、静的解析ツールでは必ずしも検出されない。
このモデルの公開例を見つけられるかどうか確認するために、次のGoogle Dorkを使用しました:
ファイルタイプ:java si「! =null &」
この検索により、RootWindowContainerからAndroidコードが取得されました
IsDocument = intention ! = null et Intent.isDocument ()
この種のコードはコードレビューを通過する可能性があります。値を隠蔽するために代入文でビット演算子を頻繁に使用するためです。しかしこの場合、結果は上記のif文の例と同じです。意図がnullの場合、NullPointerExceptionがスローされます。
非常に頻繁に、この構文で済ませてしまうのは、防御的なコーディングを心がけ、冗長なコードを書く傾向があるためです。!= null のチェックは、ほとんどのユースケースにおいて冗長と言えるでしょう。
これはプログラマーが本番コードで犯したミスです。
検索結果が最新かどうかは分かりませんが、私が実行した際には、Google、Amazon、Apache...および私自身のコードを含む結果が返されました。
私のオープンソースプロジェクトの一つで最近寄せられた抽出リクエストは、まさにこのエラーを修正するものでした。
si (tapez ! =null et tapez .trim () .length () >0) {
AcceptMediaTypeDefinitionsList.add (type.trim ()) ;
}
どうやって見つけるか
いくつかの静的解析ツールで私のサンプルコードを確認したところ、いずれのツールもこの隠された自己破壊コードを検出できませんでした。
Secure Code Warriorとして、この問題に対応できるSensei を作成・改訂しました。
ビット演算子は完全に有効であり、代入文で頻繁に使用されるため、問題のあるコードを見つけるために、if文のユースケースとビット演算子&の使用に焦点を当てた。
recherche :
expression :
N'importe lequel des :
- dans :
état : {}
valeur :
CaseSensitive : faux
correspond à : « .* » et . * »
これは正規表現を使用して、「&」が条件式として使用される場合(例えばif文内)に一致させます。
この問題を解決するため、再び正規表現に頼りました。今回はQuickFixのsed機能を使用し、式内の&を&&に一括置換します。
Correctifs disponibles :
- nom : « Remplacer l'opérateur AND au niveau du bit par l'opérateur ET logique »
actions :
- réécrire :
à : « {{#sed}} s/&/&&/g, {{{.}}} {{/sed}} »
終章の注記
これはビット演算子の最も一般的な誤用、つまり実際にはブール演算子が意図されていた場合をカバーします。
他の状況では、例えば割り当ての例のように発生する可能性がありますが、レシピ作成時には誤検知を避けるよう努める必要があります。さもなければレシピが無視されたり無効化されたりします。私たちは最も一般的な事象に対応するレシピを作成しています。Sensei、検索機能にさらなる特異性を追加し、より多くの条件をカバーできるようにする可能性があります。
現在の形で、このレシピは多くの現在のユースケースを特定でき、最も重要なのは、私のプロジェクトで報告されたユースケースである。
注記:このレシピの例とレビューには、多くのコード専門家が貢献しました:Charlie Eriksen、Matthieu Calie、Robin Claerhaut、Brysen Ackx、Nathan Desmet、Downey Robersscheuten。ご協力に感謝します。
---
IntelliJSensei をインストールするには、「環境設定 \ プラグイン」(Mac)または「設定 \ プラグイン」(Windows)を使用し、「Sensei Code」を検索してください。
Secure Code Warriorにある「sensei」リポジトリには、これらのブログ記事(この記事も含む)のソースコードやレシピが多数用意されています。
https://github.com/securecodewarrior/sensei-blog-examples
目次
Alan Richardson possède plus de vingt ans d'expérience professionnelle en informatique. Il a travaillé en tant que développeur et a occupé tous les niveaux de la hiérarchie des tests, du testeur au responsable des tests. Responsable des relations avec les développeurs chez Secure Code Warrior, il travaille directement avec les équipes, pour améliorer le développement d'un code sécurisé de qualité. Alan est l'auteur de quatre livres, dont « Dear Evil Tester » et « Java For Testers ». Alan a également créé des cours de formation en ligne pour aider les utilisateurs à apprendre les tests techniques sur le Web et Selenium WebDriver avec Java. Alan publie ses vidéos d'écriture et de formation sur SeleniumSimplified.com, EvilTester.com, JavaForTesters.com et CompendiumDev.co.uk.

Secure Code Warrior ソフトウェア開発ライフサイクル全体を通じてコードのセキュリティを確保し、サイバーセキュリティを最優先事項とする文化を構築するために、組織をSecure Code Warrior 。アプリケーションセキュリティ担当者、開発者、情報セキュリティ責任者、その他セキュリティに関わるあらゆる方々のために、当社は組織が非セキュアなコードに関連するリスクを軽減するお手伝いをいたします。
デモを予約するダウンロード



%20(1).avif)
.avif)
