Icônes SCW
héros bg sans séparateur
Blog

Problème Java - Opérateurs bit à bit et opérateurs booléens

Alan Richardson
Publié le 07 février 2021
Dernière mise à jour le 9 mars 2026

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é

Trois colonnes, une avec a, une avec b, et la dernière avec (a^b)


@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}


Le test a été réussi. Il s'agit d'un code Java parfaitement valide.


Table de vérité OR


Trois colonnes, une avec a, une avec b, et la dernière avec (a v b)


@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

En savoir plus sur Sensei


Consulter les ressources
Consulter les ressources

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.

Souhaitez-vous en savoir davantage ?

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.

En savoir plus

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.
Destinataires :
marques LinkedInSocialLogo x
Auteur
Alan Richardson
Publié le 07 février 2021

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.

Destinataires :
marques LinkedInSocialLogo x

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é

Trois colonnes, une avec a, une avec b, et la dernière avec (a^b)


@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}


Le test a été réussi. Il s'agit d'un code Java parfaitement valide.


Table de vérité OR


Trois colonnes, une avec a, une avec b, et la dernière avec (a v b)


@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

En savoir plus sur Sensei


Consulter les ressources
Consulter les ressources

Veuillez remplir le formulaire ci-dessous pour télécharger le rapport.

Nous sollicitons votre consentement pour vous envoyer des informations sur nos produits et/ou sur des sujets liés au codage sécurisé. Nous traitons toujours vos informations personnelles avec la plus grande attention et ne les vendons jamais à d'autres entreprises à des fins marketing.

Soumission
icône de réussite scw
icône d'erreur scw
Veuillez activer le cookie « Analytics » pour soumettre le formulaire. Une fois terminé, vous pouvez le désactiver à tout moment.

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é

Trois colonnes, une avec a, une avec b, et la dernière avec (a^b)


@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}


Le test a été réussi. Il s'agit d'un code Java parfaitement valide.


Table de vérité OR


Trois colonnes, une avec a, une avec b, et la dernière avec (a v b)


@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

En savoir plus sur Sensei


Veuillez consulter le webinaire.
Commencer
En savoir plus

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.
Télécharger le PDF
Consulter les ressources
Destinataires :
marques LinkedInSocialLogo x
Souhaitez-vous en savoir davantage ?

Destinataires :
marques LinkedInSocialLogo x
Auteur
Alan Richardson
Publié le 07 février 2021

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.

Destinataires :
marques LinkedInSocialLogo x

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é

Trois colonnes, une avec a, une avec b, et la dernière avec (a^b)


@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}


Le test a été réussi. Il s'agit d'un code Java parfaitement valide.


Table de vérité OR


Trois colonnes, une avec a, une avec b, et la dernière avec (a v b)


@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

En savoir plus sur Sensei


Table des matières

Télécharger le PDF
Consulter les ressources
Souhaitez-vous en savoir davantage ?

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.

En savoir plus

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écharger
Destinataires :
marques LinkedInSocialLogo x
Centre de ressources

Ressources utiles pour débuter

Plus d'articles
Centre de ressources

Ressources utiles pour débuter

Plus d'articles