{"id":94,"date":"2018-12-29T00:55:35","date_gmt":"2018-12-28T23:55:35","guid":{"rendered":"http:\/\/pinkieduck.net\/?p=94"},"modified":"2019-02-22T22:54:22","modified_gmt":"2019-02-22T21:54:22","slug":"clang-tidy","status":"publish","type":"post","link":"https:\/\/pinkieduck.net\/?p=94","title":{"rendered":"Clang-tidy"},"content":{"rendered":"\n<p class=\"has-drop-cap\">Au bureau, on nous a c\u00e9d\u00e9 le code source d&rsquo;un logiciel relativement ancien et dont le pr\u00e9c\u00e9dent propri\u00e9taire ne souhaitait pas continuer la maintenance.Si d&rsquo; m point de vue business il s&rsquo; agissait d&rsquo;une opportunit\u00e9 des plus lucratives, puisqu&rsquo;on a h\u00e9rit\u00e9 d&rsquo;une base de clients colossales, travailler sur du code qui a dormi parfois pendant pr\u00e8s de 10 ans est particuli\u00e8rement difficile.<\/p>\n\n\n\n<p>Pour dresser une image plus pr\u00e9cise, le projet utilise une version ant\u00e9diluvienne de WxWidgets et de boost, en r\u00e9impl\u00e9mentant toutefois les smart pointers (qui \u00e9taient probablement encore \u00e0 l&rsquo;\u00e9tat de standardisation \u00e0 l&rsquo;\u00e9poque ). On ressent assez rapidement le fait que plusieurs personnes sont pass\u00e9s dessus, avec un \u00e9trange m\u00e9lange de pratique douteuses de d\u00e9veloppement logiciel (des fichiers entiers copi\u00e9 et coll\u00e9s) qui c\u00f4toient les design pattern classiques d&rsquo;une base de code de taille respectable.<\/p>\n\n\n\n<p>Et bien entendu, il n&rsquo;y a pas ou peu de tests unitaires rendant chaque tentative de refactoring hasardeuse.<\/p>\n\n\n\n<p>La r\u00e9cente s\u00e9rie de posts autour de la customisation de clang-tidy sur le blog de visual c++ tombe \u00e0 bien nomm\u00e9 :<\/p>\n\n\n\n<ul><li>https:\/\/blogs.msdn.microsoft.com\/vcblog\/2018\/10\/19\/exploring-clang-tooling-part-1-extending-clang-tidy\/<\/li><li>https:\/\/blogs.msdn.microsoft.com\/vcblog\/2018\/10\/23\/exploring-clang-tooling-part-2-examining-the-clang-ast-with-clang-query\/<\/li><li>https:\/\/blogs.msdn.microsoft.com\/vcblog\/2018\/11\/06\/exploring-clang-tooling-part-3-rewriting-code-with-clang-tidy\/<\/li><\/ul>\n\n\n\n<p>Pour r\u00e9f\u00e9rence pour plus tard je partage le bout de code qui permet de d\u00e9tecter les types std::string, qu&rsquo;ils apparaissent explicitement ou via un using ou typedef:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nauto typeParamMatcher =\n\t\tvarDecl(hasType(hasUnqualifiedDesugaredType(\n     recordType(hasDeclaration(cxxRecordDecl(hasName(&quot;basic_string&quot;)))))));\n<\/pre><\/div>\n\n\n<p>Si on supprime le hasUnqualifiedDesugaredType, on peut ne matcher que l&rsquo;apparition explicite de ce type:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nvarDecl(hasType(cxxRecordDecl(matchesName(&quot;string&quot;))))\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Au bureau, on nous a c\u00e9d\u00e9 le code source d&rsquo;un logiciel relativement ancien et dont le pr\u00e9c\u00e9dent propri\u00e9taire ne souhaitait pas continuer la maintenance.Si d&rsquo; m point de vue business il s&rsquo; agissait d&rsquo;une opportunit\u00e9 des plus lucratives, puisqu&rsquo;on a h\u00e9rit\u00e9 d&rsquo;une base de clients colossales, travailler sur du code qui a dormi parfois pendant [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/pinkieduck.net\/index.php?rest_route=\/wp\/v2\/posts\/94"}],"collection":[{"href":"https:\/\/pinkieduck.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pinkieduck.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pinkieduck.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pinkieduck.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=94"}],"version-history":[{"count":2,"href":"https:\/\/pinkieduck.net\/index.php?rest_route=\/wp\/v2\/posts\/94\/revisions"}],"predecessor-version":[{"id":96,"href":"https:\/\/pinkieduck.net\/index.php?rest_route=\/wp\/v2\/posts\/94\/revisions\/96"}],"wp:attachment":[{"href":"https:\/\/pinkieduck.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pinkieduck.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pinkieduck.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}