SonarQube : public static readonly vs public const

SonarQube peut relever l’erreur S2339 lorsque vous créez des constantes publiques si vous activez la règle “Public constant members should not be used”.
Pour activer cette règle (ou tout autre règle), allez dans Quality Profiles et sélectionnez Sonar way

image
Cliquez sur le chiffre en face de Code Smells dans la section “Inactive” (44 dans notre image).
Trouvez la règle et activez-là.
image

Pourquoi S2339 ?

Pour comprendre le besoin de cette règle, il faut comprendre que le compilateur .Net, lors de la compilation de code utilisant une constante, copie directement la valeur de la constante dans le code compilé plutôt que de garder un lien vers celle-ci.

Exemple de code :

public static class Valeurs
{
public const string CodeFacteurAdaptation = "COD_1234";
public const int NombreMinimumMessage = 14;
public static readonly string CodeFacteurReduction = "COD_1235";
public static readonly int NombreMaximumMessage = 34;
}
static void Main(string[] args)
{
Afficher(Constantes.Valeurs.CodeFacteurAdaptation);
Afficher(Constantes.Valeurs.CodeFacteurReduction);
Afficher(Constantes.Valeurs.NombreMaximumMessage);
Afficher(Constantes.Valeurs.NombreMinimumMessage);
}
private static void Afficher(object valeur)
{
Console.WriteLine(valeur);
}

Si on ouvre le résultat de la compilation avec IlSpy, on obtient le code suivant :
image

L’intégration directe de la valeur dans le code compilé permet de gagner en efficacité et performance.

En quoi est-ce un problème ?

Si vous êtes dans le cas où vous réalisez une librairie utilisée par d’autres systèmes, ce comportement peut s’avérer problématique pour l’évolution de ces systèmes.

Si vous modifiez ces constantes, vous êtes obligés de recompiler ET redéployer TOUS les systèmes qui utilisent cette dll. Tous.
Si vous utilisez des membres ou propriétés static readonly, une recompilation et déploiement de la dll seront suffisants.

Constante Red heart switch

Par contre, vu que vos valeurs ne sont plus des constantes, elles ne sont plus utilisables dans une instruction switch car cela contrevient à la norme C#.

Quoi Faire ?

Vous pouvez choisir de :

  • remplacer votre switch par un ensemble de if/else if
  • déterminer que la logique d’affaire d’un assembly n’est pas censée dépendre de code présent dans un autre assembly et donc ne plus rendre vos constantes publiques.
  • ne pas activer la règle dans SonarQube et tout redéployer à chaque modification.

Comme toujours en informatique, un problème, plusieurs solutions !

image
Image http://screenheaven.com/wallpaper/rubiks-cube-cubes/58822/

Analyse statique de C# avec SonarQube

Cet article présente l’outil d’analyse statique SonarQube qui est utilisé pour estimer une dette technique.
Il présente l’outil, comment l’installer et l’utiliser pour un projet en c#.

SonarQube ?

SonarQube est un outil d’analyse statique de code qui permet de faire une inspection en continu de la qualité de votre code. Il est conçu pour détecter certaines incohérences ou anomalies de code qui pourraient passer inaperçu aux yeux des développeurs.

Il permet de détecter 3 types d’anomalies :

  • Bugs : des erreurs flagrantes de codes qui sont probablement des anomalies
  • Vulnérabilités : des situations de codes qui ne sont pas des bugs mais qui peuvent amener des risques de sécurité
  • Code Smells” : un défaut de code qui peut complexifier le code inutilement et le rendre donc plus difficile à comprendre.

Pour chaque problème, SonarQube propose un ensemble de règle qui peuvent être désactivées/activées selon vos besoins ou règles internes de développement.

Il permet aussi de relever les duplications de code.

A chaque analyse pour un même projet, il adapte ses informations afin de permettre de détecter une diminution ou une augmentation de la dette.

image

SonarQube est un logiciel libre qui existe en version communautaire gratuite.

Installation

L’installation étant amplement couverte sur le site de SonarQube, je ne m’étendrai pas dessus.
Veuillez néanmoins noter que SonarQube permet de fonctionner avec les SGBD représentatifs du marché PostgreSQL, SQL Server, MySQL et même Oracle.

Dans mes exemples, j’utiliserai la version standard non liée à un SGBD.

Effectuer une analyse

Pour effectuer une analyse du code avec SonarQube, il faut utiliser un composant de type scanner qui analyse le résultat d’une compilation.
Microsoft et SonarQube ont mis au point un scanner lié à msbuild qui permet de facilement analyser un projet ou tous les projets d’une solution.

Pour utiliser ce scanner, il faut :

  • l’installer et le configurer afin qu’il utilise votre serveur SonarQube. (Par défaut, il va utiliser un serveur sur localhost:9000)
  • démarrer une fenêtre “invite de commande msbuild”
  • exécuter l’initialisation du scanner
    c:\<installation scanner>\sonarqube.scanner.msbuild begin /k:"ex_1" /n:"EXEMPLES" /v:"1.0"
    msbuild <solution>.sln
    c:\<installation scanner>\sonarqube.scanner.msbuild end

Dans mon cas, le scanner va créer un projet “EXEMPLES” dont l’identifiant est ex_1 sur votre serveur SonarQube.

image

Attention que chaque exécution d’une analyse avec un même identifiant (“ex_1” dans mon exemple) fera évoluer les résultats dans SonarQube pour cet élément. Même si les projets analysés sont différents !

Analyse des résultats

Pour chaque type de résultat, SonarQube fournit une liste avec les fichiers en problème et le type de problème.image
Avec un double click sur la règle en erreur, vous pouvez consulter la portion du code touché.
Le bouton … permet de consulter un guide de résolution pour comprendre le problème et qui fournit même des pistes de solution.
image

Lier à TFS et VSTS

Pour utiliser SonarQube de manière efficace, il est recommandé de l’intégrer à votre gestion de cycle de vie des applications, au moment de la compilation effectuée côté serveur. Nous utilisons actuellement Visual Studio Team Services (VSTS) – la version infonuagique de TFS – pour toutes nos compilations avec un agent de compilation installé dans notre infrastructure.
VSTS propose des tâches SonarQube qui peuvent être intégrées à nos gabarits de compilation, vous pouvez vous reporter à la documentation MSDN qui couvre amplement ce point ! 

Après avoir suivi les étapes de la documentation, vous obtiendrez un gabarit de build similaire à celui-ci :

image

Pour l’utiliser dans un gabarit de build de TFS, il faut télécharger l’extension SonarQube du MarketPlace et l’installer sur votre serveur TFS. (L’utilisation est similaire à celle de VSTS)

Dans nos utilisations, nous avons activé la compilation à chaque archivage (check-in), et donc l’analyse SonarQube se fait aussi à chaque archivage.
Ceci nous permet d’avoir un excellent suivi de l’évolution de la qualité de notre code.

image
image

Exceptions

SonarQube permet de scanner plusieurs langages : C#, Java, Javascript, Css,… et cela s’est avéré problématique car dans nos projets, nous utilisons bootstrap pour lequel SonarQube relève plusieurs centaines d’erreurs.
Nous avons donc spécifié des exceptions lors de l’exécution de l’analyse.

image

La syntaxe est la même si vous exécutez une analyse manuelle :

c:\<installation scanner>\sonarqube.scanner.msbuild begin /k:"ex_1" /n:"EXEMPLES" /v:"1.0" /d:sonar.exclusions=**/*.js,**/*.html,**/*.css
msbuild <solution>.sln 
c:\<installation scanner>\sonarqube.scanner.msbuild end

Formation

Dans notre utilisation, nous nous sommes rendu compte qu’il pouvait aussi servir d’outil de formation en amenant de nouveaux concepts technologiques.
Certaines incohérences couvrent des subtilités technologiques rarement couvertes dans les situations de développement classiques ou dans les formations académiques.

Certains de nos développeurs ont découvert des choses et les disparités dans l’écriture du code diminue.

Dans des articles futurs, nous allons aborder certains problèmes relevés par SonarQube et expliquer leur raison d’être.

SonarLint

SonarLint est une extension pour visual studio qui permet d’analyser le code de manière préemptive, sans utiliser le serveur SonarQube.
Il est possible de lier SonarLint à votre serveur SonarQube pour utiliser les mêmes règles que sur le serveur.
Cette extension permet de gagner beaucoup de temps en évitant au développeurs de devoir se connecter sur le serveur SonarQube pour avoir la liste des erreurs.

Après l’installation, vous pouvez lier votre projet local à un projet en cours d’analyse sur SonarQube:

image

Lors d’une compilation, la fenêtre de liste d’erreur montrera les anomalies relevées par Sonar pour votre projet avec un lien vers la documentation pour le type d’anomalie (ex S1118) :
image