{"id":1502,"date":"2014-01-04T08:52:13","date_gmt":"2014-01-04T07:52:13","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=1502"},"modified":"2014-01-05T16:58:42","modified_gmt":"2014-01-05T15:58:42","slug":"analyse-plsql-sonarqube-blockers","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-blockers\/","title":{"rendered":"Analyse PL\/SQL avec SonarQube \u2013 Blockers"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1504\" alt=\"PLSQL_BlockersCritical\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/PLSQL_BlockersCritical.jpg\" width=\"400\" height=\"266\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/PLSQL_BlockersCritical.jpg 400w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/PLSQL_BlockersCritical-300x199.jpg 300w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/a>Dans le post pr\u00e9c\u00e9dent, nous avons cr\u00e9\u00e9 <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-quality-profile-plsql\/\" target=\"_blank\">notre propre Quality Profile PL\/SQL<\/a> en activant toutes les r\u00e8gles existantes dans SonarQube, au nombre de 132. Puis nous avons ensuite relanc\u00e9 l\u2019analyse cr\u00e9\u00e9e pr\u00e9c\u00e9demment.<\/p>\n<p>Nous allons ainsi pouvoir travailler avec l\u2019ensemble des r\u00e8gles du Quality Profile par d\u00e9faut de SonarQube et s\u00e9lectionner celles qui nous int\u00e9ressent afin de cr\u00e9er un tableau de bord \u2018PL\/SQL\u2019 pour notre environnement de d\u00e9mo. <!--more--><\/p>\n<h2>Les r\u00e8gles de type Blocker<\/h2>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/Blockers.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1511\" alt=\"Blockers\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/Blockers.jpg\" width=\"669\" height=\"167\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/Blockers.jpg 669w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/Blockers-300x74.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/Blockers-624x155.jpg 624w\" sizes=\"(max-width: 669px) 100vw, 669px\" \/><\/a><\/p>\n<p>Nous pouvons constater tout d\u2019abord 16 d\u00e9fauts concernant la r\u00e8gle \u2018Use IS NULL and IS NOT NULL instead of direct NULL comparisons\u2019. De quoi s&rsquo;agit-il ?<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1513\" alt=\"RuleNULL\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL.jpg\" width=\"428\" height=\"47\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL.jpg 428w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL-300x32.jpg 300w\" sizes=\"(max-width: 428px) 100vw, 428px\" \/><\/a>Un drill-down depuis cette liste de d\u00e9fauts et SonarQube nous permet d&rsquo;acc\u00e9der au code incrimin\u00e9.<\/p>\n<p>Nous pouvons voir que le programmeur effectue un test sur la variable &lsquo;v_periodo&rsquo; afin de v\u00e9rifier si celle-ci est une cha\u00eene (de caract\u00e8res) vide, parce qu&rsquo;elle a \u00e9t\u00e9 intialis\u00e9e de cette mani\u00e8re, ou parce que cette valeur lui est attribu\u00e9e \u00e0 un endroit donn\u00e9 de l&rsquo;algorithme. Par exemple :<\/p>\n<pre>DECLARE\r\n   name v_periodo varchar(10) := ''<\/pre>\n<p>Le probl\u00e8me est que:<\/p>\n<ol>\n<li>Oracle traite une cha\u00eene vide comme une valeur NULL. Donc \u00e0 la suite du traitement pr\u00e9c\u00e9dent, notre variable <strong>ne comporte pas<\/strong> une cha\u00eene vide, mais une valeur NULL.<\/li>\n<li>Oracle effectue la diff\u00e9rence entre une cha\u00ecne vide et une cha\u00eene de valeur NULL. Donc le test<\/li>\n<\/ol>\n<pre>IF v_periodo = ''<\/pre>\n<p>retourne <strong>false<\/strong> dans notre cas, puisque v_periodo <strong>ne comporte pas<\/strong> une cha\u00eene vide, mais une valeur NULL. Le traitement correct est :<\/p>\n<pre>IF v_periodo IS NULL<\/pre>\n<p>Nous avons l\u00e0 un bel exemple de &lsquo;bad practice&rsquo; de programmation qui conduira tr\u00e8s certainement \u00e0 un bug logique dans l&rsquo;application, puisque la condition test\u00e9e (cha\u00eene vide) ne sera jamais possible, et donc le traitement correspondant ne sera jamais effectu\u00e9.<\/p>\n<p>Et bien s\u00fbr, comme si cela ne suffisait pas, nous retrouvons ce bug dupliqu\u00e9 quelques lignes plus bas : <a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL21.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1519\" alt=\"RuleNULL2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL21.jpg\" width=\"404\" height=\"33\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL21.jpg 404w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleNULL21-300x24.jpg 300w\" sizes=\"(max-width: 404px) 100vw, 404px\" \/><\/a><\/p>\n<p>Je pense qu&rsquo;il doit exister quelque part un th\u00e9or\u00e8me informatique ou une variante quelconque de la loi de Murphy qui \u00e9dicte que le nombre de Copier-Coller d&rsquo;une instruction incorrecte est proportionnel \u00e0 la dangerosit\u00e9 du bug qu&rsquo;il induit.<\/p>\n<p>Les deux autres violations de type &lsquo;Blocker&rsquo; sont assez claires et il suffit d&rsquo;ailleurs de jeter un coup d&rsquo;oeil sur la documentation de SonarQube pour comprendre quelle est l&rsquo;erreur et quelle est sa cons\u00e9quence :<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleTrigger1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1521\" alt=\"RuleTrigger1\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleTrigger1.jpg\" width=\"582\" height=\"81\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleTrigger1.jpg 582w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleTrigger1-300x41.jpg 300w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/a><\/p>\n<p>Une instruction COMMIT ou ROLLBACK au sein d&rsquo;un trigger conduira \u00e0 une erreur ORA-04902. Il est n\u00e9cessaire d&rsquo;utiliser une PRAGMA (directive de compilation) afin de d\u00e9clarer une transaction ind\u00e9pendate pour cette manipulation. Cela dit, j&rsquo;ai tendance \u00e0 questionner tout instruction de type DML (Data Manipulation Language) au sein d&rsquo;un trigger.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleBlocker3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1522\" alt=\"RuleBlocker3\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleBlocker3.jpg\" width=\"535\" height=\"108\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleBlocker3.jpg 535w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/12\/RuleBlocker3-300x60.jpg 300w\" sizes=\"(max-width: 535px) 100vw, 535px\" \/><\/a><\/p>\n<p>Une variable a \u00e9t\u00e9 d\u00e9clar\u00e9e deux fois, ce qui conduira \u00e0 une erreur Oracle PLS-03371. J&rsquo;appr\u00e9cie tout particuli\u00e8rement que SonarQube nous indique les 2 lignes o\u00f9 cette instruction est dupliqu\u00e9e car c&rsquo;est une des plus difficiles \u00e0 investiguer, notamment dans un programme comme celui-ci qui comporte plusieurs dizaines de milliers de ligne. C&rsquo;est fr\u00e9quent dans les vieilles applications PL\/SQL &lsquo;Legacy&rsquo;.<\/p>\n<p>Que pouvons-nous dire de ces 3 r\u00e9gles &lsquo;Blockers&rsquo; ?<\/p>\n<p>Tout d&rsquo;abord que leur niveau de gravit\u00e9 se justifie compl\u00e8tement :<\/p>\n<ul>\n<li>dans le premier cas, une &lsquo;malpractice&rsquo; de programmation conduit \u00e0 une erreur logique et un bug tr\u00e8s possible,<\/li>\n<li>et les deux cas suivants sont des bugs qui feront tomber l&rsquo;application.<\/li>\n<\/ul>\n<p>Il s&rsquo;agit donc de trois r\u00e8gles pour lesquelles aucune violation ne sera permise : tol\u00e9rance z\u00e9ro, ces d\u00e9fauts doivent \u00eatre corrig\u00e9s imm\u00e9diatement.<\/p>\n<p>Seconde constatation : ces r\u00e8gles sont connues, si on en juge par le faible nombre de cas rencontr\u00e9s. N\u00e9anmoins, on peut jamais \u00e9viter :<\/p>\n<ul>\n<li>Une personne nouvelle dans l&rsquo;\u00e9quipe, \u00e9ventuellement d\u00e9butante, mais qui en tout cas ne conna\u00eet pas la &lsquo;best practice&rsquo; correspondante. Je parie que c&rsquo;est le cas de la premi\u00e8re r\u00e8gle (utiliser NULL \/ NOT NULL exclusivement), avec un m\u00eame programmeur qui a utilis\u00e9 une syntaxe incorrecte et l&rsquo;a ensuite copi\u00e9e-coll\u00e9e un peu partout.<\/li>\n<li>M\u00eame lorsque chacun conna\u00eet la r\u00e8gle en question, une erreur d&rsquo;inattention ou un oubli momentan\u00e9 reste possible.<\/li>\n<\/ul>\n<p>Il est facile d&rsquo;oublier de d\u00e9clarer une transaction ou qu&rsquo;une variable a d\u00e9j\u00e0 \u00e9t\u00e9 d\u00e9clar\u00e9e quelques dizaines (voire centaines) de lignes plus haut. Heureusement, le plugin PL\/SQL de SonarQube nous permet de v\u00e9rifier et corriger ces fautes d&rsquo;attention simplement et rapidement. J&rsquo;appr\u00e9cie tout particuli\u00e8rement de pouvoir descendre jusqu&rsquo;\u00e0 la ligne de code o\u00f9 se trouve la violation, valider celle-ci et d\u00e9cider d&rsquo;une rem\u00e9diation imm\u00e9diate.<\/p>\n<p>Dans le prochain post, nous aborderons les d\u00e9fauts de type &lsquo;Critical&rsquo;. Bonne semaine !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans le post pr\u00e9c\u00e9dent, nous avons cr\u00e9\u00e9 notre propre Quality Profile PL\/SQL en activant toutes les r\u00e8gles existantes dans SonarQube, au nombre de 132. Puis nous avons ensuite relanc\u00e9 l\u2019analyse cr\u00e9\u00e9e pr\u00e9c\u00e9demment. Nous allons ainsi pouvoir travailler avec l\u2019ensemble des r\u00e8gles du Quality Profile par d\u00e9faut de SonarQube et s\u00e9lectionner celles qui nous int\u00e9ressent afin [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-1502","post","type-post","status-publish","format-standard","hentry","category-sonarqube-plsql"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1502"}],"collection":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/comments?post=1502"}],"version-history":[{"count":32,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1502\/revisions"}],"predecessor-version":[{"id":1505,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1502\/revisions\/1505"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=1502"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=1502"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=1502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}