
Problème Java - Opérateurs bit à bit et opérateurs booléens
Problème Java - Opérateurs bit à bit et opérateurs booléens
« Java Gotcha » - Il s'agit d'un modèle d'erreur courant qui est facile à commettre par inadvertance.
L'une des erreurs les plus courantes en Java consiste à utiliser des opérateurs bit à bit à la place des opérateurs de comparaison booléens.
Par exemple, lorsque l'on souhaite réellement utiliser « && », une simple erreur de saisie peut entraîner l'utilisation de « & ».
Lors de la révision du code, les heuristiques couramment utilisées sont les suivantes.
L'utilisation de « & » ou « | » dans une condition peut ne pas être intentionnelle.
Dans cet article de blog, nous examinerons l'heuristique et explorerons des méthodes pour identifier et résoudre ce problème de codage.
Quel est le problème ? Les opérations bit à bit fonctionnent correctement avec les booléens.
L'utilisation d'opérateurs binaires avec des booléens est tout à fait valide, et Java ne signale donc pas d'erreur de syntaxe.
En configurant un test JUnit pour explorer les tables de vérité pour les opérateurs bit à bit OR (|) et AND (&), on constate que les résultats des opérateurs bit à bit correspondent aux tables de vérité. Compte tenu de cela, on pourrait penser que l'utilisation des opérateurs bit à bit ne pose pas de problème.
Table de vérité

@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}
Le test a été réussi. Il s'agit d'un code Java parfaitement valide.
Table de vérité OR

@Test
무효 비트 연산자 또는 진실 테이블 () {
어설션. 어설션 같음 (참, 참 | 참);
어설션. 어설션 같음 (참, 참 | 거짓);
어설션. 같음 어설션 (참, 거짓 | 참);
어설션. 같음 어설션 (거짓, 거짓 | 거짓);
}
Ce test a également été réussi, mais pourquoi préférer « && » et « || » ?
L'image de la table de vérité a été générée à l'aide de l'outil suivant : Tableau de vérité ... sur web.standfor.edu.
Problème : fonctionnement du paragraphe
Le véritable problème réside dans la différence de fonctionnement entre les opérateurs binaires (&, |) et les opérateurs booléens (&&, ||).
L'opérateur booléen est un opérateur court-circuité et n'est évalué que lorsque cela est nécessaire.
Exemple :
만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}
Dans ce code, l'opérateur bit à bit est utilisé, donc les deux conditions booléennes sont évaluées.
- Acquisition ! = Zéro
- Acquisition. Longueur () > 23
Dans ce cas, si l'argument est null, mon code se déclenche avec une exception NullPointerException. En effet, comme les deux conditions booléennes doivent être évaluées, la vérification de args.length est toujours effectuée, même si l'argument est null.
Évaluation du circuit court de l'opérateur booléen
Exemple d'utilisation de && :
만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}
Dès que nous prenons connaissance de cette acquisition ! Si null est évalué comme faux, l'évaluation de l'expression conditionnelle est interrompue.
Il n'est pas nécessaire d'évaluer la partie droite.
Quel que soit le résultat de la condition de droite, la valeur finale de l'expression booléenne sera fausse.
Cependant, cela ne se produira jamais dans le code de production.
Il s'agit d'une erreur très facile à commettre et qui n'est pas toujours détectable par les outils d'analyse statique.
Nous avons vérifié si des cas publics correspondant à ce modèle pouvaient être trouvés à l'aide de Google Dork.
Format de fichier : « ! dans le cas où java=null & »
Cette recherche a permis d'importer une partie du code Android dans le conteneur Windows racine.
ISDocument = intent!= null & Intent.isDocument ()
Étant donné que l'opérateur binaire est fréquemment utilisé pour masquer des valeurs dans les entrées, ce type de code est susceptible de passer la vérification. Cependant, dans ce cas, le résultat est identique à celui de l'exemple de phrase if ci-dessus. Si l'intention est toujours nulle, une exception NullPointerException se produit.
Nous avons souvent tendance à coder de manière défensive et à écrire du code en double, ce qui nous conduit à ne pas utiliser cette syntaxe. Veuillez vérifier ! = null peut être redondant dans la plupart des cas d'utilisation.
Il s'agit d'une erreur commise par le programmeur dans le code de production.
Je ne sais pas si les résultats de recherche sont récents, mais lorsque j'ai effectué la recherche, j'ai obtenu des résultats provenant de Google, Amazon, Apache... ainsi que mon propre code.
Récemment, j'ai dû résoudre précisément cette erreur dans l'un de mes projets open source sur Pull Request.
만약 (입력!=null 및 type.trim (). 길이 () >0) {
미디어 유형 정의 목록을 승인합니다. 추가 (type.trim ());
}
Comment trouver ceci
Lorsque nous avons vérifié le code échantillon dans plusieurs analyseurs statiques, aucun n'a détecté ce code autodestructeur caché.
En tant qu'équipe Secure Code Warrior, nous avons élaboré et examiné une recette très simple permettant de résoudre ce problème.
Les opérateurs bit à bit sont parfaitement valides et fréquemment utilisés dans les affectations. Par conséquent, nous nous sommes concentrés sur les cas d'utilisation des instructions if et sur l'utilisation de l'opérateur bit à bit & pour identifier les codes problématiques.
검색:
표현식:
다음 중 하나:
- 입력:
조건: {}
값:
대소문자 구분: 거짓
일치: “.* &.*”
Ceci correspond à « & » lorsqu'il est utilisé comme expression conditionnelle avec une expression régulière (par exemple, dans une instruction if).
Pour résoudre ce problème, nous avons de nouveau utilisé des expressions régulières. Cette fois-ci, nous avons utilisé la fonction sed de QuickFix pour remplacer globalement le caractère & par && dans l'expression.
사용 가능한 수정 사항:
- 이름: “비트 AND 연산자를 논리 AND 연산자로 바꾸기”
조치:
- 다시 작성:
받는 사람: “{{#sed}} s/&/&/g, {{{.}}} {{/sed}}”
Note de fin
Nous abordons ici l'utilisation incorrecte la plus courante de l'opérateur binaire, à savoir lorsque l'opérateur booléen est en réalité souhaité.
Par exemple, d'autres situations peuvent se présenter, telles que des exemples d'admission à l'université, mais il est important d'éviter les faux positifs lors de la rédaction des recettes. Dans le cas contraire, les recettes pourraient être ignorées ou désactivées. Nous élaborons des recettes adaptées aux situations les plus courantes. À mesure que Sensei évolue, nous prévoyons d'ajouter des fonctionnalités spécifiques à la fonction de recherche afin de couvrir davantage de conditions de correspondance.
Dans sa forme actuelle, cette recette permet d'identifier de nombreux cas d'utilisation réels. Le plus important est ce qui a été rapporté dans mon projet.
Remarque : Charlie Eriksen, Mathieu Calley, Robin Clairhaut, Bryson Axe, Nathan Desmet, Downey Robershoten et d'autres Code Warriors ont contribué à cet exemple et à la révision de la recette. Nous les remercions pour leur aide.
---
Dans IntelliJ, veuillez installer Sensei à l'aide de « Préférences\Plug-ins » (Mac) ou « Paramètres\Plug-ins » (Windows), puis recherchez simplement le « code de sécurité Sensei ».
Le dépôt Secure Code Warrior «sensei » de Secure Code Warrior contient de nombreux codes sources et recettes relatifs à ces articles de blog (y compris celui-ci).
https://github.com/securecodewarrior/sensei-blog-examples
Dans cet article de blog, nous examinerons les erreurs courantes de codage Java (utilisation d'opérateurs bit à bit au lieu d'opérateurs conditionnels), les erreurs qui rendent le code vulnérable, et comment utiliser Sensei pour résoudre et détecter ces problèmes.
Alan Richardson a plus de vingt ans d'expérience professionnelle dans le domaine des technologies de l'information. Il a travaillé en tant que développeur et à tous les niveaux de la hiérarchie des tests, du testeur au responsable des tests. Responsable des relations avec les développeurs à l'adresse Secure Code Warrior, il travaille directement avec les équipes pour améliorer le développement de codes sécurisés de qualité. Alan est l'auteur de quatre livres, dont "Dear Evil Tester" et "Java For Testers". Alan a également créé une formation en ligne courses pour aider les gens à apprendre les tests techniques sur le Web et Selenium WebDriver avec Java. Alan publie ses écrits et ses vidéos de formation sur SeleniumSimplified.com, EvilTester.com, JavaForTesters.com et CompendiumDev.co.uk.

Secure Code Warrior est là pour aider les organisations à protéger leur code tout au long du cycle de vie du développement logiciel et à instaurer une culture qui accorde la priorité à la cybersécurité. Que vous soyez responsable de la sécurité des applications, développeur, responsable de la sécurité des systèmes d'information ou tout autre professionnel de la sécurité, nous pouvons aider votre organisation à réduire les risques liés au code non sécurisé.
Veuillez prendre rendez-vous pour une démonstration.Alan Richardson a plus de vingt ans d'expérience professionnelle dans le domaine des technologies de l'information. Il a travaillé en tant que développeur et à tous les niveaux de la hiérarchie des tests, du testeur au responsable des tests. Responsable des relations avec les développeurs à l'adresse Secure Code Warrior, il travaille directement avec les équipes pour améliorer le développement de codes sécurisés de qualité. Alan est l'auteur de quatre livres, dont "Dear Evil Tester" et "Java For Testers". Alan a également créé une formation en ligne courses pour aider les gens à apprendre les tests techniques sur le Web et Selenium WebDriver avec Java. Alan publie ses écrits et ses vidéos de formation sur SeleniumSimplified.com, EvilTester.com, JavaForTesters.com et CompendiumDev.co.uk.
Problème Java - Opérateurs bit à bit et opérateurs booléens
« Java Gotcha » - Il s'agit d'un modèle d'erreur courant qui est facile à commettre par inadvertance.
L'une des erreurs les plus courantes en Java consiste à utiliser des opérateurs bit à bit à la place des opérateurs de comparaison booléens.
Par exemple, lorsque l'on souhaite réellement utiliser « && », une simple erreur de saisie peut entraîner l'utilisation de « & ».
Lors de la révision du code, les heuristiques couramment utilisées sont les suivantes.
L'utilisation de « & » ou « | » dans une condition peut ne pas être intentionnelle.
Dans cet article de blog, nous examinerons l'heuristique et explorerons des méthodes pour identifier et résoudre ce problème de codage.
Quel est le problème ? Les opérations bit à bit fonctionnent correctement avec les booléens.
L'utilisation d'opérateurs binaires avec des booléens est tout à fait valide, et Java ne signale donc pas d'erreur de syntaxe.
En configurant un test JUnit pour explorer les tables de vérité pour les opérateurs bit à bit OR (|) et AND (&), on constate que les résultats des opérateurs bit à bit correspondent aux tables de vérité. Compte tenu de cela, on pourrait penser que l'utilisation des opérateurs bit à bit ne pose pas de problème.
Table de vérité

@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}
Le test a été réussi. Il s'agit d'un code Java parfaitement valide.
Table de vérité OR

@Test
무효 비트 연산자 또는 진실 테이블 () {
어설션. 어설션 같음 (참, 참 | 참);
어설션. 어설션 같음 (참, 참 | 거짓);
어설션. 같음 어설션 (참, 거짓 | 참);
어설션. 같음 어설션 (거짓, 거짓 | 거짓);
}
Ce test a également été réussi, mais pourquoi préférer « && » et « || » ?
L'image de la table de vérité a été générée à l'aide de l'outil suivant : Tableau de vérité ... sur web.standfor.edu.
Problème : fonctionnement du paragraphe
Le véritable problème réside dans la différence de fonctionnement entre les opérateurs binaires (&, |) et les opérateurs booléens (&&, ||).
L'opérateur booléen est un opérateur court-circuité et n'est évalué que lorsque cela est nécessaire.
Exemple :
만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}
Dans ce code, l'opérateur bit à bit est utilisé, donc les deux conditions booléennes sont évaluées.
- Acquisition ! = Zéro
- Acquisition. Longueur () > 23
Dans ce cas, si l'argument est null, mon code se déclenche avec une exception NullPointerException. En effet, comme les deux conditions booléennes doivent être évaluées, la vérification de args.length est toujours effectuée, même si l'argument est null.
Évaluation du circuit court de l'opérateur booléen
Exemple d'utilisation de && :
만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}
Dès que nous prenons connaissance de cette acquisition ! Si null est évalué comme faux, l'évaluation de l'expression conditionnelle est interrompue.
Il n'est pas nécessaire d'évaluer la partie droite.
Quel que soit le résultat de la condition de droite, la valeur finale de l'expression booléenne sera fausse.
Cependant, cela ne se produira jamais dans le code de production.
Il s'agit d'une erreur très facile à commettre et qui n'est pas toujours détectable par les outils d'analyse statique.
Nous avons vérifié si des cas publics correspondant à ce modèle pouvaient être trouvés à l'aide de Google Dork.
Format de fichier : « ! dans le cas où java=null & »
Cette recherche a permis d'importer une partie du code Android dans le conteneur Windows racine.
ISDocument = intent!= null & Intent.isDocument ()
Étant donné que l'opérateur binaire est fréquemment utilisé pour masquer des valeurs dans les entrées, ce type de code est susceptible de passer la vérification. Cependant, dans ce cas, le résultat est identique à celui de l'exemple de phrase if ci-dessus. Si l'intention est toujours nulle, une exception NullPointerException se produit.
Nous avons souvent tendance à coder de manière défensive et à écrire du code en double, ce qui nous conduit à ne pas utiliser cette syntaxe. Veuillez vérifier ! = null peut être redondant dans la plupart des cas d'utilisation.
Il s'agit d'une erreur commise par le programmeur dans le code de production.
Je ne sais pas si les résultats de recherche sont récents, mais lorsque j'ai effectué la recherche, j'ai obtenu des résultats provenant de Google, Amazon, Apache... ainsi que mon propre code.
Récemment, j'ai dû résoudre précisément cette erreur dans l'un de mes projets open source sur Pull Request.
만약 (입력!=null 및 type.trim (). 길이 () >0) {
미디어 유형 정의 목록을 승인합니다. 추가 (type.trim ());
}
Comment trouver ceci
Lorsque nous avons vérifié le code échantillon dans plusieurs analyseurs statiques, aucun n'a détecté ce code autodestructeur caché.
En tant qu'équipe Secure Code Warrior, nous avons élaboré et examiné une recette très simple permettant de résoudre ce problème.
Les opérateurs bit à bit sont parfaitement valides et fréquemment utilisés dans les affectations. Par conséquent, nous nous sommes concentrés sur les cas d'utilisation des instructions if et sur l'utilisation de l'opérateur bit à bit & pour identifier les codes problématiques.
검색:
표현식:
다음 중 하나:
- 입력:
조건: {}
값:
대소문자 구분: 거짓
일치: “.* &.*”
Ceci correspond à « & » lorsqu'il est utilisé comme expression conditionnelle avec une expression régulière (par exemple, dans une instruction if).
Pour résoudre ce problème, nous avons de nouveau utilisé des expressions régulières. Cette fois-ci, nous avons utilisé la fonction sed de QuickFix pour remplacer globalement le caractère & par && dans l'expression.
사용 가능한 수정 사항:
- 이름: “비트 AND 연산자를 논리 AND 연산자로 바꾸기”
조치:
- 다시 작성:
받는 사람: “{{#sed}} s/&/&/g, {{{.}}} {{/sed}}”
Note de fin
Nous abordons ici l'utilisation incorrecte la plus courante de l'opérateur binaire, à savoir lorsque l'opérateur booléen est en réalité souhaité.
Par exemple, d'autres situations peuvent se présenter, telles que des exemples d'admission à l'université, mais il est important d'éviter les faux positifs lors de la rédaction des recettes. Dans le cas contraire, les recettes pourraient être ignorées ou désactivées. Nous élaborons des recettes adaptées aux situations les plus courantes. À mesure que Sensei évolue, nous prévoyons d'ajouter des fonctionnalités spécifiques à la fonction de recherche afin de couvrir davantage de conditions de correspondance.
Dans sa forme actuelle, cette recette permet d'identifier de nombreux cas d'utilisation réels. Le plus important est ce qui a été rapporté dans mon projet.
Remarque : Charlie Eriksen, Mathieu Calley, Robin Clairhaut, Bryson Axe, Nathan Desmet, Downey Robershoten et d'autres Code Warriors ont contribué à cet exemple et à la révision de la recette. Nous les remercions pour leur aide.
---
Dans IntelliJ, veuillez installer Sensei à l'aide de « Préférences\Plug-ins » (Mac) ou « Paramètres\Plug-ins » (Windows), puis recherchez simplement le « code de sécurité Sensei ».
Le dépôt Secure Code Warrior «sensei » de Secure Code Warrior contient de nombreux codes sources et recettes relatifs à ces articles de blog (y compris celui-ci).
https://github.com/securecodewarrior/sensei-blog-examples
Problème Java - Opérateurs bit à bit et opérateurs booléens
« Java Gotcha » - Il s'agit d'un modèle d'erreur courant qui est facile à commettre par inadvertance.
L'une des erreurs les plus courantes en Java consiste à utiliser des opérateurs bit à bit à la place des opérateurs de comparaison booléens.
Par exemple, lorsque l'on souhaite réellement utiliser « && », une simple erreur de saisie peut entraîner l'utilisation de « & ».
Lors de la révision du code, les heuristiques couramment utilisées sont les suivantes.
L'utilisation de « & » ou « | » dans une condition peut ne pas être intentionnelle.
Dans cet article de blog, nous examinerons l'heuristique et explorerons des méthodes pour identifier et résoudre ce problème de codage.
Quel est le problème ? Les opérations bit à bit fonctionnent correctement avec les booléens.
L'utilisation d'opérateurs binaires avec des booléens est tout à fait valide, et Java ne signale donc pas d'erreur de syntaxe.
En configurant un test JUnit pour explorer les tables de vérité pour les opérateurs bit à bit OR (|) et AND (&), on constate que les résultats des opérateurs bit à bit correspondent aux tables de vérité. Compte tenu de cela, on pourrait penser que l'utilisation des opérateurs bit à bit ne pose pas de problème.
Table de vérité

@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}
Le test a été réussi. Il s'agit d'un code Java parfaitement valide.
Table de vérité OR

@Test
무효 비트 연산자 또는 진실 테이블 () {
어설션. 어설션 같음 (참, 참 | 참);
어설션. 어설션 같음 (참, 참 | 거짓);
어설션. 같음 어설션 (참, 거짓 | 참);
어설션. 같음 어설션 (거짓, 거짓 | 거짓);
}
Ce test a également été réussi, mais pourquoi préférer « && » et « || » ?
L'image de la table de vérité a été générée à l'aide de l'outil suivant : Tableau de vérité ... sur web.standfor.edu.
Problème : fonctionnement du paragraphe
Le véritable problème réside dans la différence de fonctionnement entre les opérateurs binaires (&, |) et les opérateurs booléens (&&, ||).
L'opérateur booléen est un opérateur court-circuité et n'est évalué que lorsque cela est nécessaire.
Exemple :
만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}
Dans ce code, l'opérateur bit à bit est utilisé, donc les deux conditions booléennes sont évaluées.
- Acquisition ! = Zéro
- Acquisition. Longueur () > 23
Dans ce cas, si l'argument est null, mon code se déclenche avec une exception NullPointerException. En effet, comme les deux conditions booléennes doivent être évaluées, la vérification de args.length est toujours effectuée, même si l'argument est null.
Évaluation du circuit court de l'opérateur booléen
Exemple d'utilisation de && :
만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}
Dès que nous prenons connaissance de cette acquisition ! Si null est évalué comme faux, l'évaluation de l'expression conditionnelle est interrompue.
Il n'est pas nécessaire d'évaluer la partie droite.
Quel que soit le résultat de la condition de droite, la valeur finale de l'expression booléenne sera fausse.
Cependant, cela ne se produira jamais dans le code de production.
Il s'agit d'une erreur très facile à commettre et qui n'est pas toujours détectable par les outils d'analyse statique.
Nous avons vérifié si des cas publics correspondant à ce modèle pouvaient être trouvés à l'aide de Google Dork.
Format de fichier : « ! dans le cas où java=null & »
Cette recherche a permis d'importer une partie du code Android dans le conteneur Windows racine.
ISDocument = intent!= null & Intent.isDocument ()
Étant donné que l'opérateur binaire est fréquemment utilisé pour masquer des valeurs dans les entrées, ce type de code est susceptible de passer la vérification. Cependant, dans ce cas, le résultat est identique à celui de l'exemple de phrase if ci-dessus. Si l'intention est toujours nulle, une exception NullPointerException se produit.
Nous avons souvent tendance à coder de manière défensive et à écrire du code en double, ce qui nous conduit à ne pas utiliser cette syntaxe. Veuillez vérifier ! = null peut être redondant dans la plupart des cas d'utilisation.
Il s'agit d'une erreur commise par le programmeur dans le code de production.
Je ne sais pas si les résultats de recherche sont récents, mais lorsque j'ai effectué la recherche, j'ai obtenu des résultats provenant de Google, Amazon, Apache... ainsi que mon propre code.
Récemment, j'ai dû résoudre précisément cette erreur dans l'un de mes projets open source sur Pull Request.
만약 (입력!=null 및 type.trim (). 길이 () >0) {
미디어 유형 정의 목록을 승인합니다. 추가 (type.trim ());
}
Comment trouver ceci
Lorsque nous avons vérifié le code échantillon dans plusieurs analyseurs statiques, aucun n'a détecté ce code autodestructeur caché.
En tant qu'équipe Secure Code Warrior, nous avons élaboré et examiné une recette très simple permettant de résoudre ce problème.
Les opérateurs bit à bit sont parfaitement valides et fréquemment utilisés dans les affectations. Par conséquent, nous nous sommes concentrés sur les cas d'utilisation des instructions if et sur l'utilisation de l'opérateur bit à bit & pour identifier les codes problématiques.
검색:
표현식:
다음 중 하나:
- 입력:
조건: {}
값:
대소문자 구분: 거짓
일치: “.* &.*”
Ceci correspond à « & » lorsqu'il est utilisé comme expression conditionnelle avec une expression régulière (par exemple, dans une instruction if).
Pour résoudre ce problème, nous avons de nouveau utilisé des expressions régulières. Cette fois-ci, nous avons utilisé la fonction sed de QuickFix pour remplacer globalement le caractère & par && dans l'expression.
사용 가능한 수정 사항:
- 이름: “비트 AND 연산자를 논리 AND 연산자로 바꾸기”
조치:
- 다시 작성:
받는 사람: “{{#sed}} s/&/&/g, {{{.}}} {{/sed}}”
Note de fin
Nous abordons ici l'utilisation incorrecte la plus courante de l'opérateur binaire, à savoir lorsque l'opérateur booléen est en réalité souhaité.
Par exemple, d'autres situations peuvent se présenter, telles que des exemples d'admission à l'université, mais il est important d'éviter les faux positifs lors de la rédaction des recettes. Dans le cas contraire, les recettes pourraient être ignorées ou désactivées. Nous élaborons des recettes adaptées aux situations les plus courantes. À mesure que Sensei évolue, nous prévoyons d'ajouter des fonctionnalités spécifiques à la fonction de recherche afin de couvrir davantage de conditions de correspondance.
Dans sa forme actuelle, cette recette permet d'identifier de nombreux cas d'utilisation réels. Le plus important est ce qui a été rapporté dans mon projet.
Remarque : Charlie Eriksen, Mathieu Calley, Robin Clairhaut, Bryson Axe, Nathan Desmet, Downey Robershoten et d'autres Code Warriors ont contribué à cet exemple et à la révision de la recette. Nous les remercions pour leur aide.
---
Dans IntelliJ, veuillez installer Sensei à l'aide de « Préférences\Plug-ins » (Mac) ou « Paramètres\Plug-ins » (Windows), puis recherchez simplement le « code de sécurité Sensei ».
Le dépôt Secure Code Warrior «sensei » de Secure Code Warrior contient de nombreux codes sources et recettes relatifs à ces articles de blog (y compris celui-ci).
https://github.com/securecodewarrior/sensei-blog-examples

Veuillez cliquer sur le lien ci-dessous pour télécharger le PDF de cette ressource.
Secure Code Warrior est là pour aider les organisations à protéger leur code tout au long du cycle de vie du développement logiciel et à instaurer une culture qui accorde la priorité à la cybersécurité. Que vous soyez responsable de la sécurité des applications, développeur, responsable de la sécurité des systèmes d'information ou tout autre professionnel de la sécurité, nous pouvons aider votre organisation à réduire les risques liés au code non sécurisé.
Consulter le rapportVeuillez prendre rendez-vous pour une démonstration.Alan Richardson a plus de vingt ans d'expérience professionnelle dans le domaine des technologies de l'information. Il a travaillé en tant que développeur et à tous les niveaux de la hiérarchie des tests, du testeur au responsable des tests. Responsable des relations avec les développeurs à l'adresse Secure Code Warrior, il travaille directement avec les équipes pour améliorer le développement de codes sécurisés de qualité. Alan est l'auteur de quatre livres, dont "Dear Evil Tester" et "Java For Testers". Alan a également créé une formation en ligne courses pour aider les gens à apprendre les tests techniques sur le Web et Selenium WebDriver avec Java. Alan publie ses écrits et ses vidéos de formation sur SeleniumSimplified.com, EvilTester.com, JavaForTesters.com et CompendiumDev.co.uk.
Problème Java - Opérateurs bit à bit et opérateurs booléens
« Java Gotcha » - Il s'agit d'un modèle d'erreur courant qui est facile à commettre par inadvertance.
L'une des erreurs les plus courantes en Java consiste à utiliser des opérateurs bit à bit à la place des opérateurs de comparaison booléens.
Par exemple, lorsque l'on souhaite réellement utiliser « && », une simple erreur de saisie peut entraîner l'utilisation de « & ».
Lors de la révision du code, les heuristiques couramment utilisées sont les suivantes.
L'utilisation de « & » ou « | » dans une condition peut ne pas être intentionnelle.
Dans cet article de blog, nous examinerons l'heuristique et explorerons des méthodes pour identifier et résoudre ce problème de codage.
Quel est le problème ? Les opérations bit à bit fonctionnent correctement avec les booléens.
L'utilisation d'opérateurs binaires avec des booléens est tout à fait valide, et Java ne signale donc pas d'erreur de syntaxe.
En configurant un test JUnit pour explorer les tables de vérité pour les opérateurs bit à bit OR (|) et AND (&), on constate que les résultats des opérateurs bit à bit correspondent aux tables de vérité. Compte tenu de cela, on pourrait penser que l'utilisation des opérateurs bit à bit ne pose pas de problème.
Table de vérité

@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}
Le test a été réussi. Il s'agit d'un code Java parfaitement valide.
Table de vérité OR

@Test
무효 비트 연산자 또는 진실 테이블 () {
어설션. 어설션 같음 (참, 참 | 참);
어설션. 어설션 같음 (참, 참 | 거짓);
어설션. 같음 어설션 (참, 거짓 | 참);
어설션. 같음 어설션 (거짓, 거짓 | 거짓);
}
Ce test a également été réussi, mais pourquoi préférer « && » et « || » ?
L'image de la table de vérité a été générée à l'aide de l'outil suivant : Tableau de vérité ... sur web.standfor.edu.
Problème : fonctionnement du paragraphe
Le véritable problème réside dans la différence de fonctionnement entre les opérateurs binaires (&, |) et les opérateurs booléens (&&, ||).
L'opérateur booléen est un opérateur court-circuité et n'est évalué que lorsque cela est nécessaire.
Exemple :
만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}
Dans ce code, l'opérateur bit à bit est utilisé, donc les deux conditions booléennes sont évaluées.
- Acquisition ! = Zéro
- Acquisition. Longueur () > 23
Dans ce cas, si l'argument est null, mon code se déclenche avec une exception NullPointerException. En effet, comme les deux conditions booléennes doivent être évaluées, la vérification de args.length est toujours effectuée, même si l'argument est null.
Évaluation du circuit court de l'opérateur booléen
Exemple d'utilisation de && :
만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}
Dès que nous prenons connaissance de cette acquisition ! Si null est évalué comme faux, l'évaluation de l'expression conditionnelle est interrompue.
Il n'est pas nécessaire d'évaluer la partie droite.
Quel que soit le résultat de la condition de droite, la valeur finale de l'expression booléenne sera fausse.
Cependant, cela ne se produira jamais dans le code de production.
Il s'agit d'une erreur très facile à commettre et qui n'est pas toujours détectable par les outils d'analyse statique.
Nous avons vérifié si des cas publics correspondant à ce modèle pouvaient être trouvés à l'aide de Google Dork.
Format de fichier : « ! dans le cas où java=null & »
Cette recherche a permis d'importer une partie du code Android dans le conteneur Windows racine.
ISDocument = intent!= null & Intent.isDocument ()
Étant donné que l'opérateur binaire est fréquemment utilisé pour masquer des valeurs dans les entrées, ce type de code est susceptible de passer la vérification. Cependant, dans ce cas, le résultat est identique à celui de l'exemple de phrase if ci-dessus. Si l'intention est toujours nulle, une exception NullPointerException se produit.
Nous avons souvent tendance à coder de manière défensive et à écrire du code en double, ce qui nous conduit à ne pas utiliser cette syntaxe. Veuillez vérifier ! = null peut être redondant dans la plupart des cas d'utilisation.
Il s'agit d'une erreur commise par le programmeur dans le code de production.
Je ne sais pas si les résultats de recherche sont récents, mais lorsque j'ai effectué la recherche, j'ai obtenu des résultats provenant de Google, Amazon, Apache... ainsi que mon propre code.
Récemment, j'ai dû résoudre précisément cette erreur dans l'un de mes projets open source sur Pull Request.
만약 (입력!=null 및 type.trim (). 길이 () >0) {
미디어 유형 정의 목록을 승인합니다. 추가 (type.trim ());
}
Comment trouver ceci
Lorsque nous avons vérifié le code échantillon dans plusieurs analyseurs statiques, aucun n'a détecté ce code autodestructeur caché.
En tant qu'équipe Secure Code Warrior, nous avons élaboré et examiné une recette très simple permettant de résoudre ce problème.
Les opérateurs bit à bit sont parfaitement valides et fréquemment utilisés dans les affectations. Par conséquent, nous nous sommes concentrés sur les cas d'utilisation des instructions if et sur l'utilisation de l'opérateur bit à bit & pour identifier les codes problématiques.
검색:
표현식:
다음 중 하나:
- 입력:
조건: {}
값:
대소문자 구분: 거짓
일치: “.* &.*”
Ceci correspond à « & » lorsqu'il est utilisé comme expression conditionnelle avec une expression régulière (par exemple, dans une instruction if).
Pour résoudre ce problème, nous avons de nouveau utilisé des expressions régulières. Cette fois-ci, nous avons utilisé la fonction sed de QuickFix pour remplacer globalement le caractère & par && dans l'expression.
사용 가능한 수정 사항:
- 이름: “비트 AND 연산자를 논리 AND 연산자로 바꾸기”
조치:
- 다시 작성:
받는 사람: “{{#sed}} s/&/&/g, {{{.}}} {{/sed}}”
Note de fin
Nous abordons ici l'utilisation incorrecte la plus courante de l'opérateur binaire, à savoir lorsque l'opérateur booléen est en réalité souhaité.
Par exemple, d'autres situations peuvent se présenter, telles que des exemples d'admission à l'université, mais il est important d'éviter les faux positifs lors de la rédaction des recettes. Dans le cas contraire, les recettes pourraient être ignorées ou désactivées. Nous élaborons des recettes adaptées aux situations les plus courantes. À mesure que Sensei évolue, nous prévoyons d'ajouter des fonctionnalités spécifiques à la fonction de recherche afin de couvrir davantage de conditions de correspondance.
Dans sa forme actuelle, cette recette permet d'identifier de nombreux cas d'utilisation réels. Le plus important est ce qui a été rapporté dans mon projet.
Remarque : Charlie Eriksen, Mathieu Calley, Robin Clairhaut, Bryson Axe, Nathan Desmet, Downey Robershoten et d'autres Code Warriors ont contribué à cet exemple et à la révision de la recette. Nous les remercions pour leur aide.
---
Dans IntelliJ, veuillez installer Sensei à l'aide de « Préférences\Plug-ins » (Mac) ou « Paramètres\Plug-ins » (Windows), puis recherchez simplement le « code de sécurité Sensei ».
Le dépôt Secure Code Warrior «sensei » de Secure Code Warrior contient de nombreux codes sources et recettes relatifs à ces articles de blog (y compris celui-ci).
https://github.com/securecodewarrior/sensei-blog-examples
Table des matières
Alan Richardson a plus de vingt ans d'expérience professionnelle dans le domaine des technologies de l'information. Il a travaillé en tant que développeur et à tous les niveaux de la hiérarchie des tests, du testeur au responsable des tests. Responsable des relations avec les développeurs à l'adresse Secure Code Warrior, il travaille directement avec les équipes pour améliorer le développement de codes sécurisés de qualité. Alan est l'auteur de quatre livres, dont "Dear Evil Tester" et "Java For Testers". Alan a également créé une formation en ligne courses pour aider les gens à apprendre les tests techniques sur le Web et Selenium WebDriver avec Java. Alan publie ses écrits et ses vidéos de formation sur SeleniumSimplified.com, EvilTester.com, JavaForTesters.com et CompendiumDev.co.uk.

Secure Code Warrior est là pour aider les organisations à protéger leur code tout au long du cycle de vie du développement logiciel et à instaurer une culture qui accorde la priorité à la cybersécurité. Que vous soyez responsable de la sécurité des applications, développeur, responsable de la sécurité des systèmes d'information ou tout autre professionnel de la sécurité, nous pouvons aider votre organisation à réduire les risques liés au code non sécurisé.
Veuillez prendre rendez-vous pour une démonstration.TéléchargerRessources utiles pour débuter
Thèmes et contenus de la formation sur les codes de sécurité
Le contenu le plus pertinent du secteur évolue constamment pour s'adapter à l'environnement de développement logiciel en constante évolution, en tenant compte du rôle des clients. Des architectes et ingénieurs aux chefs de produit et responsables de l'assurance qualité, tous les rôles sont couverts, de l'IA à l'injection XQuery. Veuillez consulter le catalogue de contenu pour découvrir ce qui est proposé par thème et par rôle.
La Chambre de commerce établit la norme en matière de sécurité à grande échelle axée sur les développeurs
La Chambre de commerce néerlandaise explique comment elle a intégré le codage sécurisé dans le développement quotidien grâce à des certifications basées sur les rôles, à l'évaluation comparative du Trust Score et à une culture de responsabilité partagée en matière de sécurité.
Modélisation des menaces avec l'IA : transformer chaque développeur en modélisateur de menaces
Vous repartirez mieux équipé pour aider les développeurs à combiner les idées et les techniques de modélisation des menaces avec les outils d'IA qu'ils utilisent déjà pour renforcer la sécurité, améliorer la collaboration et créer des logiciels plus résilients dès le départ.
Ressources utiles pour débuter
Cybermon est de retour : la mission IA de défaite du boss est désormais disponible à la demande.
Cybermon 2025 Bit The Boss est désormais disponible toute l'année sur SCW. Renforcez le développement de l'IA de sécurité à grande échelle en déployant des défis de sécurité IA/LLM avancés.
Explication de la loi sur la cyber-résilience : l'importance de la conception sécurisée dans le développement de logiciels
Découvrez les exigences de la loi européenne sur la résilience des réseaux et des services (CRA), son champ d'application et comment votre équipe d'ingénieurs peut se préparer en toute sécurité grâce à la conception, aux pratiques, à la prévention des vulnérabilités et à la mise en place d'un environnement de développement.
Facteur de réussite n° 1 : des critères de réussite clairement définis et mesurables
Enabler 1 présente une série de dix articles consacrés aux facteurs de réussite, en démontrant comment le codage sécurisé peut améliorer les performances commerciales, notamment en accélérant la réduction des risques et des coûts pour la maturité des programmes à long terme.




%20(1).avif)
.avif)
