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

Pièges 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

Pièges Java - Opérateurs bit à bit et opérateurs booléens

« Java Gotcha » - un modèle d'erreur courant qui peut facilement être mis en œuvre de manière inattendue.

Un problème Java relativement simple qui peut survenir de manière inattendue est l'utilisation d'opérateurs bit à bit au lieu d'opérateurs de comparaison booléens.

Par exemple, lorsque vous souhaitez réellement saisir « && », une simple erreur de frappe peut entraîner la saisie de « & ».

Les heuristiques courantes que nous avons apprises lors de la révision du code sont les suivantes :

L'utilisation de « & » ou « | » dans les conditions peut ne pas être intentionnelle.

Dans cet article de blog, nous examinerons les approches heuristiques et déterminerons les méthodes permettant d'identifier et de corriger ce problème de codage.


Quel est le problème ? L'utilisation des opérations booléennes permet d'effectuer correctement les opérations bit à bit.


L'utilisation d'opérateurs bit à bit avec des valeurs booléennes est tout à fait valide, par conséquent Java ne signalera pas d'erreur de syntaxe.

Si je construis un test JUnit pour explorer les tables de vérité des opérateurs bit à bit OU (|) et ET (&), nous constaterons que les résultats des opérateurs bit à bit correspondent aux tables de vérité. Compte tenu de cela, nous pourrions conclure que l'utilisation des opérateurs bit à bit ne pose aucun problème.

ET Tableau des vérités

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


@Test
void Opérateurs bit à bit et TruthTable () {
assertions.asserteQuals(vrai, vrai et vrai);
assertions.asserteQuals(faux, vrai et faux);
assertions.asserteQuals(faux, faux et vrai);
assertions.asserteQuals(faux, faux et faux);
}


Le test a été réussi, il s'agit de Java entièrement fonctionnel.


Tableau des vérités


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


@Test
void Opérateur bit à bit ou table de vérité () {
assertions.asserteQuals(vrai, vrai | vrai);
assertions.asserteQuals(vrai, vrai | faux);
assertions.asserteQuals(vrai, faux | vrai);
assertions.asserteQuals(faux, faux | faux);
}


Ce test a également été réussi. Pourquoi préférons-nous « && » et « || » ?


Le tableau de vérité est une image créée à l'aide de l'outil de tableau de vérité. outil de tableau de vérité à partir de web.standfor.edu.


Question : Opération de court-circuit


Le véritable problème réside dans la différence de comportement entre les opérateurs bit à bit (&, |) et les opérateurs booléens (&&, ||).

Les opérateurs booléens sont des opérateurs de court-circuit et ne sont évalués que lorsque cela est nécessaire.

Par exemple

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


Dans le code ci-dessus, les deux conditions booléennes seront évaluées, car l'opérateur bit à bit est utilisé :

  • args ! = valeur nulle
  • args.length () > 23

Si args est vide, cela expose mon code à un risque de NullPointerException, car même si le paramètre est vide, nous continuerons à vérifier args.length, car les deux conditions booléennes doivent être évaluées.


Évaluation de court-circuit des opérateurs booléens


Lorsque vous utilisez &&, par exemple

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


Dès lors que nous savons que args != null, le résultat du calcul est faux et l'expression conditionnelle cesse d'être évaluée.

Nous n'avons pas besoin d'évaluer la partie droite.

Quelle que soit la valeur 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 fréquente, mais les outils d'analyse statique ne la commettent pas systématiquement.

J'ai utilisé Google Dork pour vérifier s'il était possible de trouver des exemples publics de ce modèle :

Type de fichier : java if « !=null & »
Cette recherche a permis de retrouver dans rootwindowContainer du code provenant d'Android
isDocument = intent != null & intent.isDocument ()


Ce code pourrait passer le contrôle de code, car nous utilisons souvent des opérateurs bit à bit dans les instructions d'affectation pour masquer les valeurs. Cependant, dans ce cas, le résultat est identique à celui de l'exemple d'instruction if ci-dessus. Si l'intention est toujours vide, une exception NullPointerException sera levée.

Nous avons tendance à contourner cette structure en recourant fréquemment au codage défensif et en écrivant du code redondant. La vérification « != null » est probablement superflue dans la plupart des cas d'utilisation.

Il s'agit d'une erreur commise par un programmeur dans le code de production.

Je ne sais pas si les résultats de recherche sont récents, mais lorsque j'effectue une recherche, les résultats proviennent de Google, Amazon, Apache... et de moi-même.

La dernière demande de tirage dans l'un de mes projets open source visait précisément à résoudre cette erreur.

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


Comment trouver ceci


Lorsque j'ai examiné mon exemple de code dans plusieurs analyseurs statiques, aucun d'entre eux n'a détecté ce code autodestructeur caché.

En tant Secure Code Warrior , nous avons élaboré et examiné une Sensei relativement simple Sensei de résoudre ce problème.

Étant donné que les opérateurs bit à bit sont pleinement efficaces et fréquemment utilisés pour l'affectation, nous avons examiné de manière approfondie les cas d'utilisation des instructions if et l'utilisation de Bitwise & afin d'identifier le code problématique.

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


Lorsqu'il est utilisé comme expression conditionnelle, il utilise une expression régulière pour correspondre à « & ». Par exemple, dans une instruction if.

Pour résoudre ce problème, nous nous appuyons à nouveau sur les expressions régulières. Cette fois-ci, nous utilisons la fonction sed de QuickFix pour remplacer globalement tous les & par && dans l'expression.

Correctif disponible :
- Nom : « Remplacer l'opérateur AND bit à bit par l'opérateur AND logique »
Action :
- Réécriture :
Remplacer par : « {{#sed}} s/&/&&&g,{{{.}}} {{/sed}} »


Note de fin

Ceci couvre les cas les plus courants d'utilisation abusive des opérateurs bit à bit, c'est-à-dire lorsque l'on utilise en réalité des opérateurs booléens.

Dans d'autres cas, cela peut se produire, par exemple dans des exemples de tâches, mais lors de la rédaction de recettes, nous devons éviter autant que possible les faux positifs, sinon les recettes seront ignorées ou désactivées. Nous créons des recettes pour correspondre aux cas les plus courants. À mesure que Sensei évolue, nous ajouterons probablement des spécificités supplémentaires à la fonction de recherche afin de couvrir davantage de conditions de correspondance.

Dans sa forme actuelle, cette formule reconnaîtra de nombreux cas d'utilisation pratiques, et surtoutcelui présenté dans mon projet.

Remarque : plusieurs contributeurs ont apporté leur expertise en matière de code à cet exemple et à la révision de la recette : Charlie Erikson, Matthew Carley, Robin Clairhout, Bryson Axe, Nathan Desmet et Donny Robershoten. Nous vous remercions pour votre aide.


---


Vous pouvez installer Sensei à partir d'IntelliJ en utilisant « Préférences\Plugins » (Mac) ou « Paramètres\Plugins » (Windows), Sensei «sensei

Dans le référentiel «sensei » du compte Secure Code Warrior de Secure Code Warrior , nous avons rassemblé le code source et les recettes de nombreux articles de blog, y compris celui-ci.

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

En savoir plus sur Sensei


Veuillez consulter les ressources.
Veuillez consulter les ressources.

Dans cet article de blog, nous examinerons une erreur courante dans le codage Java (l'utilisation d'opérateurs bit à bit au lieu d'opérateurs conditionnels), les vulnérabilités qu'elle introduit dans notre code et comment utiliser Sensei corriger et détecter ce problème.

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 peut aider votre organisation à sécuriser le 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, directeur de la sécurité de l'information ou tout autre professionnel concerné par la sécurité, nous pouvons aider votre organisation à réduire les risques liés au code non sécurisé.

Veuillez réserver une démonstration.
Partager sur :
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.

Partager sur :
marques LinkedInSocialLogo x

Pièges Java - Opérateurs bit à bit et opérateurs booléens

« Java Gotcha » - un modèle d'erreur courant qui peut facilement être mis en œuvre de manière inattendue.

Un problème Java relativement simple qui peut survenir de manière inattendue est l'utilisation d'opérateurs bit à bit au lieu d'opérateurs de comparaison booléens.

Par exemple, lorsque vous souhaitez réellement saisir « && », une simple erreur de frappe peut entraîner la saisie de « & ».

Les heuristiques courantes que nous avons apprises lors de la révision du code sont les suivantes :

L'utilisation de « & » ou « | » dans les conditions peut ne pas être intentionnelle.

Dans cet article de blog, nous examinerons les approches heuristiques et déterminerons les méthodes permettant d'identifier et de corriger ce problème de codage.


Quel est le problème ? L'utilisation des opérations booléennes permet d'effectuer correctement les opérations bit à bit.


L'utilisation d'opérateurs bit à bit avec des valeurs booléennes est tout à fait valide, par conséquent Java ne signalera pas d'erreur de syntaxe.

Si je construis un test JUnit pour explorer les tables de vérité des opérateurs bit à bit OU (|) et ET (&), nous constaterons que les résultats des opérateurs bit à bit correspondent aux tables de vérité. Compte tenu de cela, nous pourrions conclure que l'utilisation des opérateurs bit à bit ne pose aucun problème.

ET Tableau des vérités

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


@Test
void Opérateurs bit à bit et TruthTable () {
assertions.asserteQuals(vrai, vrai et vrai);
assertions.asserteQuals(faux, vrai et faux);
assertions.asserteQuals(faux, faux et vrai);
assertions.asserteQuals(faux, faux et faux);
}


Le test a été réussi, il s'agit de Java entièrement fonctionnel.


Tableau des vérités


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


@Test
void Opérateur bit à bit ou table de vérité () {
assertions.asserteQuals(vrai, vrai | vrai);
assertions.asserteQuals(vrai, vrai | faux);
assertions.asserteQuals(vrai, faux | vrai);
assertions.asserteQuals(faux, faux | faux);
}


Ce test a également été réussi. Pourquoi préférons-nous « && » et « || » ?


Le tableau de vérité est une image créée à l'aide de l'outil de tableau de vérité. outil de tableau de vérité à partir de web.standfor.edu.


Question : Opération de court-circuit


Le véritable problème réside dans la différence de comportement entre les opérateurs bit à bit (&, |) et les opérateurs booléens (&&, ||).

Les opérateurs booléens sont des opérateurs de court-circuit et ne sont évalués que lorsque cela est nécessaire.

Par exemple

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


Dans le code ci-dessus, les deux conditions booléennes seront évaluées, car l'opérateur bit à bit est utilisé :

  • args ! = valeur nulle
  • args.length () > 23

Si args est vide, cela expose mon code à un risque de NullPointerException, car même si le paramètre est vide, nous continuerons à vérifier args.length, car les deux conditions booléennes doivent être évaluées.


Évaluation de court-circuit des opérateurs booléens


Lorsque vous utilisez &&, par exemple

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


Dès lors que nous savons que args != null, le résultat du calcul est faux et l'expression conditionnelle cesse d'être évaluée.

Nous n'avons pas besoin d'évaluer la partie droite.

Quelle que soit la valeur 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 fréquente, mais les outils d'analyse statique ne la commettent pas systématiquement.

J'ai utilisé Google Dork pour vérifier s'il était possible de trouver des exemples publics de ce modèle :

Type de fichier : java if « !=null & »
Cette recherche a permis de retrouver dans rootwindowContainer du code provenant d'Android
isDocument = intent != null & intent.isDocument ()


Ce code pourrait passer le contrôle de code, car nous utilisons souvent des opérateurs bit à bit dans les instructions d'affectation pour masquer les valeurs. Cependant, dans ce cas, le résultat est identique à celui de l'exemple d'instruction if ci-dessus. Si l'intention est toujours vide, une exception NullPointerException sera levée.

Nous avons tendance à contourner cette structure en recourant fréquemment au codage défensif et en écrivant du code redondant. La vérification « != null » est probablement superflue dans la plupart des cas d'utilisation.

Il s'agit d'une erreur commise par un programmeur dans le code de production.

Je ne sais pas si les résultats de recherche sont récents, mais lorsque j'effectue une recherche, les résultats proviennent de Google, Amazon, Apache... et de moi-même.

La dernière demande de tirage dans l'un de mes projets open source visait précisément à résoudre cette erreur.

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


Comment trouver ceci


Lorsque j'ai examiné mon exemple de code dans plusieurs analyseurs statiques, aucun d'entre eux n'a détecté ce code autodestructeur caché.

En tant Secure Code Warrior , nous avons élaboré et examiné une Sensei relativement simple Sensei de résoudre ce problème.

Étant donné que les opérateurs bit à bit sont pleinement efficaces et fréquemment utilisés pour l'affectation, nous avons examiné de manière approfondie les cas d'utilisation des instructions if et l'utilisation de Bitwise & afin d'identifier le code problématique.

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


Lorsqu'il est utilisé comme expression conditionnelle, il utilise une expression régulière pour correspondre à « & ». Par exemple, dans une instruction if.

Pour résoudre ce problème, nous nous appuyons à nouveau sur les expressions régulières. Cette fois-ci, nous utilisons la fonction sed de QuickFix pour remplacer globalement tous les & par && dans l'expression.

Correctif disponible :
- Nom : « Remplacer l'opérateur AND bit à bit par l'opérateur AND logique »
Action :
- Réécriture :
Remplacer par : « {{#sed}} s/&/&&&g,{{{.}}} {{/sed}} »


Note de fin

Ceci couvre les cas les plus courants d'utilisation abusive des opérateurs bit à bit, c'est-à-dire lorsque l'on utilise en réalité des opérateurs booléens.

Dans d'autres cas, cela peut se produire, par exemple dans des exemples de tâches, mais lors de la rédaction de recettes, nous devons éviter autant que possible les faux positifs, sinon les recettes seront ignorées ou désactivées. Nous créons des recettes pour correspondre aux cas les plus courants. À mesure que Sensei évolue, nous ajouterons probablement des spécificités supplémentaires à la fonction de recherche afin de couvrir davantage de conditions de correspondance.

Dans sa forme actuelle, cette formule reconnaîtra de nombreux cas d'utilisation pratiques, et surtoutcelui présenté dans mon projet.

Remarque : plusieurs contributeurs ont apporté leur expertise en matière de code à cet exemple et à la révision de la recette : Charlie Erikson, Matthew Carley, Robin Clairhout, Bryson Axe, Nathan Desmet et Donny Robershoten. Nous vous remercions pour votre aide.


---


Vous pouvez installer Sensei à partir d'IntelliJ en utilisant « Préférences\Plugins » (Mac) ou « Paramètres\Plugins » (Windows), Sensei «sensei

Dans le référentiel «sensei » du compte Secure Code Warrior de Secure Code Warrior , nous avons rassemblé le code source et les recettes de nombreux articles de blog, y compris celui-ci.

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

En savoir plus sur Sensei


Veuillez consulter les ressources.
Veuillez consulter les ressources.

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

Nous souhaiterions obtenir votre autorisation afin de vous envoyer des informations concernant nos produits et/ou des sujets liés à la sécurité informatique. Nous traiterons toujours vos informations personnelles avec la plus grande confidentialité et ne les vendrons jamais à d'autres entreprises à des fins commerciales.

Soumettre
icône de réussite scw
icône d'erreur scw
Pour soumettre le formulaire, veuillez activer les cookies analytiques. Une fois terminé, vous pouvez les désactiver à nouveau si vous le souhaitez.

Pièges Java - Opérateurs bit à bit et opérateurs booléens

« Java Gotcha » - un modèle d'erreur courant qui peut facilement être mis en œuvre de manière inattendue.

Un problème Java relativement simple qui peut survenir de manière inattendue est l'utilisation d'opérateurs bit à bit au lieu d'opérateurs de comparaison booléens.

Par exemple, lorsque vous souhaitez réellement saisir « && », une simple erreur de frappe peut entraîner la saisie de « & ».

Les heuristiques courantes que nous avons apprises lors de la révision du code sont les suivantes :

L'utilisation de « & » ou « | » dans les conditions peut ne pas être intentionnelle.

Dans cet article de blog, nous examinerons les approches heuristiques et déterminerons les méthodes permettant d'identifier et de corriger ce problème de codage.


Quel est le problème ? L'utilisation des opérations booléennes permet d'effectuer correctement les opérations bit à bit.


L'utilisation d'opérateurs bit à bit avec des valeurs booléennes est tout à fait valide, par conséquent Java ne signalera pas d'erreur de syntaxe.

Si je construis un test JUnit pour explorer les tables de vérité des opérateurs bit à bit OU (|) et ET (&), nous constaterons que les résultats des opérateurs bit à bit correspondent aux tables de vérité. Compte tenu de cela, nous pourrions conclure que l'utilisation des opérateurs bit à bit ne pose aucun problème.

ET Tableau des vérités

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


@Test
void Opérateurs bit à bit et TruthTable () {
assertions.asserteQuals(vrai, vrai et vrai);
assertions.asserteQuals(faux, vrai et faux);
assertions.asserteQuals(faux, faux et vrai);
assertions.asserteQuals(faux, faux et faux);
}


Le test a été réussi, il s'agit de Java entièrement fonctionnel.


Tableau des vérités


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


@Test
void Opérateur bit à bit ou table de vérité () {
assertions.asserteQuals(vrai, vrai | vrai);
assertions.asserteQuals(vrai, vrai | faux);
assertions.asserteQuals(vrai, faux | vrai);
assertions.asserteQuals(faux, faux | faux);
}


Ce test a également été réussi. Pourquoi préférons-nous « && » et « || » ?


Le tableau de vérité est une image créée à l'aide de l'outil de tableau de vérité. outil de tableau de vérité à partir de web.standfor.edu.


Question : Opération de court-circuit


Le véritable problème réside dans la différence de comportement entre les opérateurs bit à bit (&, |) et les opérateurs booléens (&&, ||).

Les opérateurs booléens sont des opérateurs de court-circuit et ne sont évalués que lorsque cela est nécessaire.

Par exemple

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


Dans le code ci-dessus, les deux conditions booléennes seront évaluées, car l'opérateur bit à bit est utilisé :

  • args ! = valeur nulle
  • args.length () > 23

Si args est vide, cela expose mon code à un risque de NullPointerException, car même si le paramètre est vide, nous continuerons à vérifier args.length, car les deux conditions booléennes doivent être évaluées.


Évaluation de court-circuit des opérateurs booléens


Lorsque vous utilisez &&, par exemple

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


Dès lors que nous savons que args != null, le résultat du calcul est faux et l'expression conditionnelle cesse d'être évaluée.

Nous n'avons pas besoin d'évaluer la partie droite.

Quelle que soit la valeur 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 fréquente, mais les outils d'analyse statique ne la commettent pas systématiquement.

J'ai utilisé Google Dork pour vérifier s'il était possible de trouver des exemples publics de ce modèle :

Type de fichier : java if « !=null & »
Cette recherche a permis de retrouver dans rootwindowContainer du code provenant d'Android
isDocument = intent != null & intent.isDocument ()


Ce code pourrait passer le contrôle de code, car nous utilisons souvent des opérateurs bit à bit dans les instructions d'affectation pour masquer les valeurs. Cependant, dans ce cas, le résultat est identique à celui de l'exemple d'instruction if ci-dessus. Si l'intention est toujours vide, une exception NullPointerException sera levée.

Nous avons tendance à contourner cette structure en recourant fréquemment au codage défensif et en écrivant du code redondant. La vérification « != null » est probablement superflue dans la plupart des cas d'utilisation.

Il s'agit d'une erreur commise par un programmeur dans le code de production.

Je ne sais pas si les résultats de recherche sont récents, mais lorsque j'effectue une recherche, les résultats proviennent de Google, Amazon, Apache... et de moi-même.

La dernière demande de tirage dans l'un de mes projets open source visait précisément à résoudre cette erreur.

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


Comment trouver ceci


Lorsque j'ai examiné mon exemple de code dans plusieurs analyseurs statiques, aucun d'entre eux n'a détecté ce code autodestructeur caché.

En tant Secure Code Warrior , nous avons élaboré et examiné une Sensei relativement simple Sensei de résoudre ce problème.

Étant donné que les opérateurs bit à bit sont pleinement efficaces et fréquemment utilisés pour l'affectation, nous avons examiné de manière approfondie les cas d'utilisation des instructions if et l'utilisation de Bitwise & afin d'identifier le code problématique.

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


Lorsqu'il est utilisé comme expression conditionnelle, il utilise une expression régulière pour correspondre à « & ». Par exemple, dans une instruction if.

Pour résoudre ce problème, nous nous appuyons à nouveau sur les expressions régulières. Cette fois-ci, nous utilisons la fonction sed de QuickFix pour remplacer globalement tous les & par && dans l'expression.

Correctif disponible :
- Nom : « Remplacer l'opérateur AND bit à bit par l'opérateur AND logique »
Action :
- Réécriture :
Remplacer par : « {{#sed}} s/&/&&&g,{{{.}}} {{/sed}} »


Note de fin

Ceci couvre les cas les plus courants d'utilisation abusive des opérateurs bit à bit, c'est-à-dire lorsque l'on utilise en réalité des opérateurs booléens.

Dans d'autres cas, cela peut se produire, par exemple dans des exemples de tâches, mais lors de la rédaction de recettes, nous devons éviter autant que possible les faux positifs, sinon les recettes seront ignorées ou désactivées. Nous créons des recettes pour correspondre aux cas les plus courants. À mesure que Sensei évolue, nous ajouterons probablement des spécificités supplémentaires à la fonction de recherche afin de couvrir davantage de conditions de correspondance.

Dans sa forme actuelle, cette formule reconnaîtra de nombreux cas d'utilisation pratiques, et surtoutcelui présenté dans mon projet.

Remarque : plusieurs contributeurs ont apporté leur expertise en matière de code à cet exemple et à la révision de la recette : Charlie Erikson, Matthew Carley, Robin Clairhout, Bryson Axe, Nathan Desmet et Donny Robershoten. Nous vous remercions pour votre aide.


---


Vous pouvez installer Sensei à partir d'IntelliJ en utilisant « Préférences\Plugins » (Mac) ou « Paramètres\Plugins » (Windows), Sensei «sensei

Dans le référentiel «sensei » du compte Secure Code Warrior de Secure Code Warrior , nous avons rassemblé le code source et les recettes de nombreux articles de blog, y compris celui-ci.

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

En savoir plus sur Sensei


Visionner le webinaire
Commençons.
En savoir plus

Veuillez cliquer sur le lien ci-dessous pour télécharger le PDF de cette ressource.

Secure Code Warrior peut aider votre organisation à sécuriser le 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, directeur de la sécurité de l'information ou tout autre professionnel concerné par la sécurité, nous pouvons aider votre organisation à réduire les risques liés au code non sécurisé.

Veuillez consulter le rapport.Veuillez réserver une démonstration.
Télécharger le PDF
Veuillez consulter les ressources.
Partager sur :
marques LinkedInSocialLogo x
Souhaitez-vous en savoir davantage ?

Partager sur :
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.

Partager sur :
marques LinkedInSocialLogo x

Pièges Java - Opérateurs bit à bit et opérateurs booléens

« Java Gotcha » - un modèle d'erreur courant qui peut facilement être mis en œuvre de manière inattendue.

Un problème Java relativement simple qui peut survenir de manière inattendue est l'utilisation d'opérateurs bit à bit au lieu d'opérateurs de comparaison booléens.

Par exemple, lorsque vous souhaitez réellement saisir « && », une simple erreur de frappe peut entraîner la saisie de « & ».

Les heuristiques courantes que nous avons apprises lors de la révision du code sont les suivantes :

L'utilisation de « & » ou « | » dans les conditions peut ne pas être intentionnelle.

Dans cet article de blog, nous examinerons les approches heuristiques et déterminerons les méthodes permettant d'identifier et de corriger ce problème de codage.


Quel est le problème ? L'utilisation des opérations booléennes permet d'effectuer correctement les opérations bit à bit.


L'utilisation d'opérateurs bit à bit avec des valeurs booléennes est tout à fait valide, par conséquent Java ne signalera pas d'erreur de syntaxe.

Si je construis un test JUnit pour explorer les tables de vérité des opérateurs bit à bit OU (|) et ET (&), nous constaterons que les résultats des opérateurs bit à bit correspondent aux tables de vérité. Compte tenu de cela, nous pourrions conclure que l'utilisation des opérateurs bit à bit ne pose aucun problème.

ET Tableau des vérités

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


@Test
void Opérateurs bit à bit et TruthTable () {
assertions.asserteQuals(vrai, vrai et vrai);
assertions.asserteQuals(faux, vrai et faux);
assertions.asserteQuals(faux, faux et vrai);
assertions.asserteQuals(faux, faux et faux);
}


Le test a été réussi, il s'agit de Java entièrement fonctionnel.


Tableau des vérités


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


@Test
void Opérateur bit à bit ou table de vérité () {
assertions.asserteQuals(vrai, vrai | vrai);
assertions.asserteQuals(vrai, vrai | faux);
assertions.asserteQuals(vrai, faux | vrai);
assertions.asserteQuals(faux, faux | faux);
}


Ce test a également été réussi. Pourquoi préférons-nous « && » et « || » ?


Le tableau de vérité est une image créée à l'aide de l'outil de tableau de vérité. outil de tableau de vérité à partir de web.standfor.edu.


Question : Opération de court-circuit


Le véritable problème réside dans la différence de comportement entre les opérateurs bit à bit (&, |) et les opérateurs booléens (&&, ||).

Les opérateurs booléens sont des opérateurs de court-circuit et ne sont évalués que lorsque cela est nécessaire.

Par exemple

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


Dans le code ci-dessus, les deux conditions booléennes seront évaluées, car l'opérateur bit à bit est utilisé :

  • args ! = valeur nulle
  • args.length () > 23

Si args est vide, cela expose mon code à un risque de NullPointerException, car même si le paramètre est vide, nous continuerons à vérifier args.length, car les deux conditions booléennes doivent être évaluées.


Évaluation de court-circuit des opérateurs booléens


Lorsque vous utilisez &&, par exemple

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


Dès lors que nous savons que args != null, le résultat du calcul est faux et l'expression conditionnelle cesse d'être évaluée.

Nous n'avons pas besoin d'évaluer la partie droite.

Quelle que soit la valeur 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 fréquente, mais les outils d'analyse statique ne la commettent pas systématiquement.

J'ai utilisé Google Dork pour vérifier s'il était possible de trouver des exemples publics de ce modèle :

Type de fichier : java if « !=null & »
Cette recherche a permis de retrouver dans rootwindowContainer du code provenant d'Android
isDocument = intent != null & intent.isDocument ()


Ce code pourrait passer le contrôle de code, car nous utilisons souvent des opérateurs bit à bit dans les instructions d'affectation pour masquer les valeurs. Cependant, dans ce cas, le résultat est identique à celui de l'exemple d'instruction if ci-dessus. Si l'intention est toujours vide, une exception NullPointerException sera levée.

Nous avons tendance à contourner cette structure en recourant fréquemment au codage défensif et en écrivant du code redondant. La vérification « != null » est probablement superflue dans la plupart des cas d'utilisation.

Il s'agit d'une erreur commise par un programmeur dans le code de production.

Je ne sais pas si les résultats de recherche sont récents, mais lorsque j'effectue une recherche, les résultats proviennent de Google, Amazon, Apache... et de moi-même.

La dernière demande de tirage dans l'un de mes projets open source visait précisément à résoudre cette erreur.

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


Comment trouver ceci


Lorsque j'ai examiné mon exemple de code dans plusieurs analyseurs statiques, aucun d'entre eux n'a détecté ce code autodestructeur caché.

En tant Secure Code Warrior , nous avons élaboré et examiné une Sensei relativement simple Sensei de résoudre ce problème.

Étant donné que les opérateurs bit à bit sont pleinement efficaces et fréquemment utilisés pour l'affectation, nous avons examiné de manière approfondie les cas d'utilisation des instructions if et l'utilisation de Bitwise & afin d'identifier le code problématique.

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


Lorsqu'il est utilisé comme expression conditionnelle, il utilise une expression régulière pour correspondre à « & ». Par exemple, dans une instruction if.

Pour résoudre ce problème, nous nous appuyons à nouveau sur les expressions régulières. Cette fois-ci, nous utilisons la fonction sed de QuickFix pour remplacer globalement tous les & par && dans l'expression.

Correctif disponible :
- Nom : « Remplacer l'opérateur AND bit à bit par l'opérateur AND logique »
Action :
- Réécriture :
Remplacer par : « {{#sed}} s/&/&&&g,{{{.}}} {{/sed}} »


Note de fin

Ceci couvre les cas les plus courants d'utilisation abusive des opérateurs bit à bit, c'est-à-dire lorsque l'on utilise en réalité des opérateurs booléens.

Dans d'autres cas, cela peut se produire, par exemple dans des exemples de tâches, mais lors de la rédaction de recettes, nous devons éviter autant que possible les faux positifs, sinon les recettes seront ignorées ou désactivées. Nous créons des recettes pour correspondre aux cas les plus courants. À mesure que Sensei évolue, nous ajouterons probablement des spécificités supplémentaires à la fonction de recherche afin de couvrir davantage de conditions de correspondance.

Dans sa forme actuelle, cette formule reconnaîtra de nombreux cas d'utilisation pratiques, et surtoutcelui présenté dans mon projet.

Remarque : plusieurs contributeurs ont apporté leur expertise en matière de code à cet exemple et à la révision de la recette : Charlie Erikson, Matthew Carley, Robin Clairhout, Bryson Axe, Nathan Desmet et Donny Robershoten. Nous vous remercions pour votre aide.


---


Vous pouvez installer Sensei à partir d'IntelliJ en utilisant « Préférences\Plugins » (Mac) ou « Paramètres\Plugins » (Windows), Sensei «sensei

Dans le référentiel «sensei » du compte Secure Code Warrior de Secure Code Warrior , nous avons rassemblé le code source et les recettes de nombreux 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
Veuillez 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 peut aider votre organisation à sécuriser le 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, directeur de la sécurité de l'information ou tout autre professionnel concerné par la sécurité, nous pouvons aider votre organisation à réduire les risques liés au code non sécurisé.

Veuillez réserver une démonstration.Télécharger
Partager sur :
marques LinkedInSocialLogo x
Centre de ressources

Ressources pour vous aider à démarrer

Plus d'articles
Centre de ressources

Ressources pour vous aider à démarrer

Plus d'articles