Kalimetrix IBM Business Partner

Kalimetrix est partenaire et revendeur agréé des produits logiciels de la gamme IBM Rational. 

 
les scop
Règles de programmation C

Cette page donne une description d'une partie des règles de programmation vérifiées par l'outil Logiscope.

Règles de présentation

CodePres_1_DeclarationPerLineUne seule déclarationpar ligne
CodePres_2_NumberStatementsPas plus de 100 instructions dans une fonction et pas plus de 1000 dans un fichier
CodePres_3_FileLengthPas plus de 2000 lignes dans un fichier
CodePres_4_StatementSwitchPas plus de 10 clauses dans un switch
CodePres_5_StatementSwitchPas plus de 25 instructions dans chaque clause d'un switch
CodePres_6_CommentStatementLineLes commentaires ne doivent pas être sur la même ligne que les instrcutions
CodePres_7_ExtensionHeaderLes noms des fichiers header doivent avoir un suffixe ".h"
CodePres_8_EnumBooleanDéfinit un type booléen de la façon suivante :  typedef enum { false = 0, true = 1 } Boolean ;
CodePres_9_ParamFunctionPas plus de 7 paramètres pour les fonctions
CodePres_10_StatementPerLineUne seule instruction par ligne
CodePres_11_ControlStructureLes structures de contrôle doivent débuter sur une nouvelle ligne : - do - while - for - if - else - switch - return - break - continue
CodePres_12_BlankLine

Les parties déclarations et instructions d'une focntion doivent être séparées par une ligne blanche.

CodePres_13_BraceLes blocs d'instructions doivent être entre accolades.
CodePres_14_CommentDeclarationToutes les déclarations doivent être commentées.
CodePres_15_PointerDeclarationDans une déclaration de pointeur, le caractère "*" doit être collé au nom du pointeur.
CodePres_16_SpacingRefPas d'espace avant ou après "." et "->".
CodePres_17_SpacingOperatorLes opérateurs "++", "--", "&" (functionAddress) , "*" (FunctionRef) doivent être collés à leur opérande.
CodePres_18_SpacingParameterDans un appel de fonction, il ne doit pas y avoir d'espace après la parenthèse ouvrante et avant la parenthèse fermante.
CodePres_19_LineLengthUne ligne ne doit pas contenir plus de 80 caractères.
CodePres_25_SingleLineCommentLes commentaires doivent être sur une seule ligne.
CodePres_26_CommentDefinitionToutes les définitions doivent être commentées.
CodePres_28_DefinitionsUn fichier body ".c" doit contenir les définitions des variables exportées contenues dans le fichier header ".h" correspondant.
CodePres_29_SpacingUnaryOperatorLes opérateurs unaires "!" et "~" doivent être collés à leur opérande.
CodePres_30_DefineLes directives "#define" doivent être groupées.

Règles protégeant des pièges du langage C

Complexity_13_SimpleTestLes instructions du type x == y; et x != y; sont interdites
ControlFlow_1_NoDeadCodePas de code après "goto", "return", "break" ou "continue".
ControlFlow_4_ThenElseLes parties "then" et "else" d'une structure "if" ne doivent pas être vides.
ControlFlow_8_BreakPathInSwitchToutes les branches des clauses d'un switch doivent se terminer par un break.

 Règles limitant la complexité du code

Complexity_1_MultipleAssignmentPas d'affectations en cascade
Complexity_2_NoTernaryOpPas d'utilisation de l'opérateur ternaire "?"
Complexity_3_NoUnary+Pas d'utilisation de l'opérateur unaire "+"
Complexity_4_NoAssignmentOpPas d'utilisation des opérateurs d'affectation autres que "=" comme "*=", "/=", "+="...
Complexity_5_CallResultUtiliser la valeur de retour des fonctions
Complexity_6_++--OperatorsN'utiliser "++" et "--" que dans les cas simples.
Complexity_7_NoCastPas de cast.
Complexity_8_NoMultipleInitPas d'initialisation dans des déclarations multiples.
Complexity_9_MacroPas de macros avec plusieurs instructions.
Complexity_10_FieldAddressingPour accéder à un élément de structure pointée, utiliser la notation "Ptr->Field" au lieu de "(*Ptr).Field"
Complexity_11_NoCommaAndTernaryNe pas utiliser les opérateurs ',' et '?'.
Complexity_12_OperatorInConditionUne condition aved plus de 4 opérateurs logiques ne doit pas contenir des opérateurs différents.
Complexity_13_SimpleTestLes instructions du type x == y; et x != y; sont interdites
Complexity_14_InclusionLevelLes inclusions de fichiers sont interdites dans les fichiers header.
Complexity_15_SizeofL'opérande du l'opérateur "sizeof" doit être entre parenthèses.

Règles permettant d'améliorer la structuration du code.

ControlFlow_10_SwitchBetterThanIfUtiliser un switch plutôt que des tests en cascade.
ControlFlow_11_OneBreakContinueUn seul "break" ou "continue" autorisé dans le corps d'une  boucle do, while ou for.
ControlFlow_1_NoDeadCodePas de code après goto", "return", "break" ou "continue".
ControlFlow_2_FunctionReturnUn seul return autorisé par fonction.
ControlFlow_3_NoGotoPas de goto.
ControlFlow_4_ThenElseLes parties "then" et "else" d'une structure "if" ne doivent pas être vides.
ControlFlow_5_NoBreakContinue"break" et "continue" interdits dans le corps d'une  boucle do, while ou for.
ControlFlow_6_DefaultInSwitchLa clause "default" est obligatoire dans les switchs.
ControlFlow_7_BreakInSwitchLe "break" est obligatoire comme dernière instruction de chaque clause d'un switch.
ControlFlow_8_BreakPathInSwitchToutes les branches des clauses d'un switch doivent se terminer par un break.
ControlFlow_9_ControlStructureNestingPas plus de 6 structures de contrôles imbriquées.

Règles pour la portabilité

Portability_1_C++KeywordsNe pas utiliser les mots clé du langage C++ comme identificateurs : class, new, friend, ...
Portability_2_NoDollarNe pas utiliser le caractère "$" dans les identificateurs.
Portability_4_CharIdentifierUtiliser uniquement les lettres (majuscules et minuscules), les chiffres et le caractère souligné dans les identificateurs.
Portability_5_NoSignedRightShiftPas de décalage à droite sur des entiers signés.
Portability_6_MainNamingExit obligatoire pour sortir du programme principal.
Portability_7_NoRecursiveHeaderLes inclusions de fichiers récursives sont interdites.
Portability_9U_AbsolutePathIncludeLe nom de fichier utilisé dans une directive "#include" doit avoir la même casse que le fichier correspondant.
ortability_12U_FilenameLengthLes noms de fichiers doivent être en minuscules et ne pas dépasser 8 caractères pour le nom et 3 caractères pour l'extension.
Portability_13_NoTabNe pas utiliser le caractère tabulation dans un fichier source.

 Règles facilitant la maintenance

Resource_1_AccessArrayUtiliser un pointeur pour parcourir les éléments d'un tableau plutôt qu'un index.
Resource_2_ForCounterNe pas changer le compteur de boucle à l'intérieur d'une boucle.
Resource_3_DeclarationInitSeparateLes variables doivent être déclarées et initialisées séparément.
Resource_4_DeclarationInitCombineLes variables doivent être déclarées et initialisées simultanément.
Resource_5_LocalDeclarationIl ne faut pas déclarer de variables locales à un bloc.
Resource_6_GlobalDeclarationLes objets globaux doivent être déclarés dans un fichier header.
Resource_7_VariableUseLes variables déclarées doivent être utilisées.
Resource_8_FunctionUseLes fonctions déclarées doivent être utilisées.
Resource_9_ParameterUseTous les paramètres des fonctions doivent être utilisés.
Resource_10_NoGlobalParameterUne variable globale ne doit pas être utilisée comme paramètre d'une fonction.
Resource_11_InputParameterL'ordre des paramètres d'une fonction doit être : objet courant, paramètres en entrée, paramètres en sortie
Resource_12_NoExternBodyLe mot clé "extern" est interdit dans un fichier body (".c").
Resource_13_NoStaticInFuncLes variables déclarées "static" sont interdites dans les fonctions.
Resource_14_ExternHeaderToutes les déclarations de variables dans un fichier header doivent être précédées du mot clé "extern".
Resource_15_NoFunctionHeaderAucune définition de fonction ne doit se trouver dans un fichier header.
Resource_16_FileExtensionLes noms des fichiers header doivent avoir une extension ".h" et ceux des fichiers body une extension ".c".
Resource_18_NoBodyInclusionUn fichier ".c" ne doit pas être inclus pas une autre fichier ".c".
Resource_19_NoBitfieldLes champs de bits sont interdits.
Resource_20_NoAutoLes déclarations de variables locales ne doivent pas être "auto".
Resource_21_ArrayInitL'initialisation d'un tableau doit être conforme à sa structure.
Resource_22_PointerInitUn pointeur doit toujours être initialisé.
Resource_23_WhileInitLa valeur initiale du paramètre d'une boucle doit être connue avant l'entrée dans la boucle.
Resource_24_ConstVolatileInitSeules les variables déclarées const et volatiles doivent être initialisées à leur définition.
Resource_26_TypedefUnionStructUn typedef ne doit pas masquer une structure ou une union.
Resource_30_EnumInitLes valeurs des enums ne doiveny pas être explicites.
Resource_31_StructUnionL'usage des unions doit être limité.
Resource_32_ForSpecificationToutes les parties de l'instruction "for" doivent être remplies.