{"id":252589,"date":"2022-05-12T14:06:40","date_gmt":"2022-05-12T13:06:40","guid":{"rendered":"https:\/\/blog.jetbrains.com\/qodana\/2022\/05\/qodana-2022-1-is-available\/"},"modified":"2025-09-18T13:32:11","modified_gmt":"2025-09-18T12:32:11","slug":"qodana-2022-1-est-disponible","status":"publish","type":"qodana","link":"https:\/\/blog.jetbrains.com\/fr\/qodana\/2022\/05\/qodana-2022-1-est-disponible\/","title":{"rendered":"Qodana 2022.1 est disponible"},"content":{"rendered":"\n<p>Nous ajoutons r\u00e9guli\u00e8rement de nouvelles fonctionnalit\u00e9s \u00e0 Qodana, notre plateforme de contr\u00f4le de la qualit\u00e9 du code, et l&#8217;am\u00e9liorons continuellement. Afin de vous tenir au courant, nous lan\u00e7ons une s\u00e9rie d&#8217;articles sur ses actualit\u00e9s et \u00e9volutions, qui commence avec cet article sur la nouvelle version majeure Qodana 2022.1.<\/p>\n\n\n\n<p><em>License audit<\/em> \u00e9tait un linter suppl\u00e9mentaire qui devait \u00eatre configur\u00e9 s\u00e9par\u00e9ment des linters principaux. Il est d\u00e9sormais fourni directement avec Qodana. Nous avons \u00e9galement ajout\u00e9 plusieurs nouvelles inspections pour les linters PHP et JVM. Poursuivez votre lecture pour en savoir plus&nbsp;!<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/XDUC2ReAqWMNoQNTNpRSK_LttAmoeg9yL5AdF_3DOdRjyxAbZ0YIvvJNCQUHgGzZ8flbAKVETOhtkZ3f2TuYMT2jSVtvPynCz-72y39MmlPvHo2vC5gC2syVvxiK1kyWm7roSH46rngJwaz0nw.png\" style=\"\"><\/p>\n\n\n\n<p align=\"center\"><a class=\"jb-download-button\" title=\"COMMENCER AVEC QODANA\" href=\"https:\/\/www.jetbrains.com\/qodana\" target=\"_blank\" rel=\"noopener noreferrer\" data-mce-href=\"https:\/\/www.jetbrains.com\/qodana\" data-mce-selected=\"inline-boundary\" data-mce-><i class=\"download-icon\"><\/i>COMMENCER AVEC QODANA<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Audit de licences<\/h1>\n\n\n\n<p>Les p\u00e9nalit\u00e9s l\u00e9gales et de conformit\u00e9 relatives aux licences non valides ou utilis\u00e9es de mani\u00e8re inappropri\u00e9e dans votre code peuvent \u00eatre extr\u00eamement co\u00fbteuses. Qodana permet d&#8217;analyser les d\u00e9pendances dans votre r\u00e9f\u00e9rentiel de code pour v\u00e9rifier les licences et identifier les sources de probl\u00e8mes potentiels.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/05\/license_auditing_qodana.png\" alt=\"La fonctionnalit\u00e9 Licence Audit de Qodana\" data-gif-src=\"https:\/\/resources.jetbrains.com\/storage\/products\/blog\/wp-content\/uploads\/license_auditing_qodana.gif\"><\/figure>\n\n\n\n<p>Cette nouvelle version de Qodana simplifie l&#8217;audit de licences de vos projets et l&#8217;int\u00e8gre dans votre pipeline de CI\/CD. La nouvelle fonctionnalit\u00e9 <em>License audit<\/em> est disponible pour tous les linters, notamment pour Python, Java, Kotlin, PHP et JavaScript.<br>Pour activer <em>License audit<\/em>, ajoutez les lignes suivantes dans le fichier <code>qodana.yaml<\/code> \u00e0 la racine de votre projet :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">include:\n  - name: CheckDependencyLicenses<\/pre>\n\n\n\n<p>Si vous devez ignorer l&#8217;une des d\u00e9pendances de votre projet, ajoutez les lignes suivantes :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dependencyIgnores:\n- name: \"dependency\/name\"<\/pre>\n\n\n\n<p>Lisez <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/license-audit.html\" target=\"_blank\" rel=\"noreferrer noopener\">notre documentation<\/a> pour plus d&#8217;informations sur les configurations personnalis\u00e9es pour <em>License audit<\/em> et <a href=\"https:\/\/blog.jetbrains.com\/qodana\/2022\/05\/keep-your-dependency-licenses-in-check\/\" target=\"_blank\" rel=\"noreferrer noopener\">cet article de blog<\/a> pour d\u00e9couvrir comment cette fonctionnalit\u00e9 permet d&#8217;optimiser les routines de travail des d\u00e9veloppeurs, des responsables et des \u00e9quipes l\u00e9gales.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Inspections PHP<\/h1>\n\n\n\n<p>Cette version de Qodana inclut toutes les nouvelles inspections de PhpStorm 2022.1 et les ajoute \u00e0 votre pipeline avec nos linters PHP. PhpStorm est fourni avec Qodana, par cons\u00e9quent, lorsque Qodana vous signale un probl\u00e8me dans votre code, vous pouvez ouvrir la notification directement dans votre IDE et examiner le code concern\u00e9.<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/GAkqNfy12zleqr2G1ctXqLpkeDu_TW_qNIhRe_K7NiXYtNxGAJ7lbgyar3_3zjHyGjmSh0ffn8f3zcBrrwsYO8cahSgZxXvXKopqPNVW2gITRuXp7kd0azAxeoc4q4g-ylRxa7M7SVVDR99Q6A.png\" style=\"\"><\/p>\n\n\n\n<p><strong>Duplicate array key<\/strong><\/p>\n\n\n\n<p>Le comportement de <code>array_merge()<\/code> et la fusion avec l&#8217;op\u00e9rateur <code>+<\/code> fonctionnent diff\u00e9remment en PHP. L&#8217;op\u00e9rateur ne remplace pas la valeur si la cl\u00e9 est dupliqu\u00e9e. Comme cela peut \u00eatre source de confusion et de bugs, Qodana for PHP met d\u00e9sormais ce type de cas en \u00e9vidence.<\/p>\n\n\n\n<p><strong>Utilisation de count($array) comme index de tableau<\/strong><\/p>\n\n\n\n<p>Lors de l&#8217;ajout d&#8217;un \u00e9l\u00e9ment \u00e0 un tableau, il n&#8217;est pas n\u00e9cessaire de sp\u00e9cifier explicitement l&#8217;index. Qodana for PHP peut vous pr\u00e9venir en cas d&#8217;appel <code>count()<\/code> redondant.<\/p>\n\n\n\n<p><strong>Remplacer les appels pow() par **<\/strong><\/p>\n\n\n\n<p>PHP dispose d&#8217;un op\u00e9rateur d&#8217;exponentiation <code>**<\/code> depuis la version 5.6. Qodana for PHP sugg\u00e8rera un correctif rapide directement dans PhpStorm (Alt+Entr\u00e9e) afin de remplacer les anciens appels <code>pow()<\/code> par l&#8217;op\u00e9rateur **.<\/p>\n\n\n\n<p><strong>Propri\u00e9t\u00e9s read-only<\/strong><\/p>\n\n\n\n<p>Les propri\u00e9t\u00e9s priv\u00e9es avec acc\u00e8s en lecture seule dans une classe peuvent \u00eatre d\u00e9clar\u00e9es avec l&#8217;indicateur <code>readonly<\/code>. Qodana for PHP sugg\u00e9rera de mettre \u00e0 jour la d\u00e9claration de propri\u00e9t\u00e9.<\/p>\n\n\n\n<p><strong>Constantes de classe finales<\/strong><\/p>\n\n\n\n<p>Depuis PHP 8.1, il est possible de d\u00e9clarer les constantes de classes comme finales. C&#8217;est pourquoi Qodana for PHP vous avertit des constantes qui ne sont pas h\u00e9rit\u00e9es et vous sugg\u00e8re de leur ajouter un modificateur <code>final<\/code>. Avec l&#8217;int\u00e9gration de PhpStorm, vous pouvez basculer rapidement vers l&#8217;IDE pour corriger le probl\u00e8me.<\/p>\n\n\n\n<p><strong>Arguments de fonction rand en ordre invers\u00e9<\/strong><\/p>\n\n\n\n<p>Cette inspection met en \u00e9vidence les appels de fonction appartenant \u00e0 la famille rand pour lesquels l&#8217;argument max peut \u00eatre inf\u00e9rieur \u00e0 l&#8217;argument min. Par exemple, appeler <code>rand(10, 1)<\/code> \u00e9quivaut \u00e0 appeler <code>rand(1, 10)<\/code>, mais <code>mt_rand()<\/code> est strict sur l&#8217;ordre de ses arguments.<\/p>\n\n\n\n<p><strong>Cible fictive non valide pour PHPUnit<\/strong><\/p>\n\n\n\n<p>Qodana for PHP vous avertira si vous essayez d&#8217;acc\u00e9der \u00e0 une m\u00e9thode priv\u00e9e ou finale sur un objet factice.<\/p>\n\n\n\n<p><strong>Redundant modifier<\/strong><\/p>\n\n\n\n<p>Cette nouvelle inspection signale les modificateurs qui sont utilis\u00e9s dans les mod\u00e8les d&#8217;expressions r\u00e9guli\u00e8res mais n&#8217;affectent pas la correspondance :<\/p>\n\n\n\n<ul>\n<li><code>\/i <\/code>(insensibilit\u00e9 \u00e0 la casse) dans les mod\u00e8les qui ne contiennent pas de lettres.<\/li>\n\n\n\n<li><code>\/D<\/code> (<em>PCRE_DOLLAR_ENDONLY<\/em>) dans les mod\u00e8les qui ne contiennent pas de signe dollar ou qui contiennent le modificateur <code>m<\/code> (PCRE_MULTILINE).<\/li>\n\n\n\n<li><code>\/s <\/code>(point correspond aux sauts de ligne) dans les mod\u00e8les qui ne contiennent pas de points.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Unsupported modifier<\/strong><\/p>\n\n\n\n<p>Cette inspection signale les utilisations du modificateur <code>\/e<\/code>, qui est obsol\u00e8te dans les versions PHP 7.0 et plus r\u00e9centes.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Inspections Java et Kotlin<\/h1>\n\n\n\n<p>Cette version ajoute \u00e9galement de nouvelles inspections provenant d&#8217;IntelliJ IDEA 2022.1 dans Qodana for JVM. L&#8217;int\u00e9gration avec IntelliJ IDEA permet d&#8217;ouvrir le code erron\u00e9 directement dans l&#8217;IDE pour apporter un correctif rapide.<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/Gaawael6izJr4fT60bitnNJlRD_d-fMeBUep9opM92THL1utcWW057LLRJNM9YsYgE8sS0QBaLgvUG_JU5gFQ8p_E_MicVl1Y7wTmbbIrKEDuw-e4pbjvX8FPX7D0sglKqq7aWeyEawoWvChvQ.png\" style=\"\"><\/p>\n\n\n\n<p>Voyons les inspections les plus significatives.<\/p>\n\n\n\n<p><strong>Suspicious back reference<\/strong><\/p>\n\n\n\n<p>Qodana for JVM trouve les r\u00e9f\u00e9rences qui ne peuvent pas \u00eatre r\u00e9solues lors de l&#8217;ex\u00e9cution. L&#8217;inspection Suspicious back reference vous avertit si la r\u00e9f\u00e9rence arri\u00e8re ne correspond \u00e0 aucun texte. Une r\u00e9f\u00e9rence arri\u00e8re ne peut pas \u00eatre r\u00e9solue si le groupe est d\u00e9fini apr\u00e8s la r\u00e9f\u00e9rence arri\u00e8re ou dans une branche diff\u00e9rente d&#8217;une alternance.<\/p>\n\n\n\n<p><strong>&#8220;InputStream&#8221; et &#8220;OutputStream&#8221; peuvent \u00eatre construits avec des m\u00e9thodes &#8216;Files&#8217;<\/strong><\/p>\n\n\n\n<p>Cette inspection signale les constructeurs <code>FileInputStream<\/code> et <code>FileOutputStream<\/code> lorsqu&#8217;ils peuvent \u00eatre remplac\u00e9s par <code>Files.newInputStream()<\/code> et <code>Files.newOutputStream()<\/code>, respectivement. Les flux (streams) cr\u00e9\u00e9s avec les m\u00e9thodes <code>Files<\/code> sont g\u00e9n\u00e9ralement plus efficaces que ceux qui sont cr\u00e9\u00e9s par les constructeurs de flux.<\/p>\n\n\n\n<p><strong>Les appels group\u00e9s &#8216;Files.readAttributes&#8217; peuvent \u00eatre utilis\u00e9s \u00e0 la place de plusieurs appels d&#8217;attributs de fichiers<\/strong><\/p>\n\n\n\n<p>Cette inspection trouve les emplacements o\u00f9 plusieurs v\u00e9rifications d&#8217;attributs java.io.File, telles que <code>isDirectory<\/code>, <code>isFile<\/code>, <code>lastModified<\/code> ou <code>length<\/code>, sont utilis\u00e9es \u00e0 la suite. Ces appels peuvent \u00eatre remplac\u00e9s par un appel group\u00e9 <code>Files.readAttributes<\/code>. La m\u00e9thode group\u00e9e est g\u00e9n\u00e9ralement plus performante que les v\u00e9rifications d&#8217;attributs multiples .&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p><strong>La boucle peut \u00eatre remplac\u00e9e par &#8216;List.replaceAll()&#8217;<\/strong><\/p>\n\n\n\n<p>Cette inspection signale les boucles qui peuvent \u00eatre r\u00e9duites \u00e0 un simple appel <code>List.replaceAll()<\/code>.<\/p>\n\n\n\n<p><strong>Number of placeholders does not match the number of arguments in logging call<\/strong><\/p>\n\n\n\n<p>Qodana for JVM signale les appels de journalisation (logging) <code>SLF4J<\/code> ou <code>Log4j 2<\/code>, tels que <code>logger.info(\"{}: {}\", key)<\/code>, dans lesquels le nombre de placeholders <code>{}<\/code> dans le message du logger ne correspond pas au nombre d&#8217;autres arguments dans l&#8217;appel de journalisation.<\/p>\n\n\n\n<p><strong>Regular expressions can be simplified<\/strong><\/p>\n\n\n\n<p>Cette inspection d\u00e9tecte les expressions r\u00e9guli\u00e8res qui peuvent \u00eatre simplifi\u00e9es.&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p>Pour exclure certaines inspections de votre analyse, vous pouvez personnaliser votre profil d&#8217;inspection par d\u00e9faut ou en cr\u00e9er un nouveau. Vous pouvez aussi vouloir appliquer les inspections importantes selon vos directives de codage ou les bonnes pratiques. Consultez la <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-yaml.html#Include+an+inspection+into+the+analysis+scope\" target=\"_blank\" rel=\"noreferrer noopener\">documentation de Qodana<\/a> pour plus d&#8217;informations.<\/p>\n\n\n\n<p>Voil\u00e0, vous connaissez maintenant toutes les nouveaut\u00e9s de Qodana 2022.1&nbsp;! Nous esp\u00e9rons que les prochains articles de cette s\u00e9rie vous seront utiles. Si vous avez des suggestions pour de futurs sujets d&#8217;articles ou si vous souhaitez en savoir plus sur la fa\u00e7on dont Qodana peut vous aider, vous et votre entreprise, laissez un commentaire ci-dessous, taguez-nous sur <a href=\"https:\/\/twitter.com\/Qodana\" target=\"_blank\" rel=\"noreferrer noopener\">Twitter<\/a> ou \u00e9crivez-nous \u00e0 <em>qodana-support@jetbrains.com<\/em>.<\/p>\n\n\n\n<p><em>L&#8217;\u00c9quipe Qodana<\/em><\/p>\n\n\n\n<p><em>Auteur de l&#8217;article original en anglais<\/em> :<\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":245687,"comment_status":"closed","ping_status":"closed","template":"","categories":[5088,4113,907],"tags":[6982,228,6976,6688,190],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/252589"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/qodana"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=252589"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/252589\/revisions"}],"predecessor-version":[{"id":632202,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/qodana\/252589\/revisions\/632202"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/245687"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=252589"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=252589"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=252589"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=252589"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}