Atteignez la conformité Cert C en toute simplicité avec CppDepend
Atteignez la conformité Cert C en toute simplicité avec CppDepend
Dans le paysage concurrentiel du développement logiciel actuel, maintenir un code de haute qualité et sécurisé est essentiel. Le standard de codage Cert C sert de guide pour créer des applications C fiables et sûres. Mais comment les développeurs peuvent-ils atteindre efficacement la conformité Cert C dans leurs projets ?
Voici CppDepend, un outil complet spécialement conçu pour vous aider à naviguer dans les complexités du standard Cert C. En utilisant des techniques d'analyse statique, CppDepend vous guide non seulement vers la conformité, mais vous permet également d'améliorer la qualité et la sécurité globales du code.
Pour apprendre les standards CERT C, vous pouvez imprimer Documentation du standard de codage SEI CERT C par la Carnegie Mellon University.
Utiliser les règles CERT C dans CppDepend
Lorsque vous créez un nouveau projet CppDepend, une fenêtre contextuelle apparaît affichant tous les standards de codage que vous souhaitez inclure dans votre analyse. Pour inclure les standards de codage Cert C, cochez l'option Cert et choisissez Cert C.

Après avoir analysé votre projet, naviguez vers la section Queries and Rules Explorer et sélectionnez les règles Cert C dans le menu de gauche (surligné en rouge dans l'image ci-dessous). Cela affichera toutes les règles Cert C associées à droite. En cliquant sur une règle, la requête CQLinq correspondante et le code source pertinent seront automatiquement générés. De plus, la section Metrics View fournit une visualisation de l'emplacement et de l'importance du problème.

Intégration des règles CERT C dans le rapport HTML
Pour inclure les règles Cert C dans le rapport HTML généré (disponible dans la DevOps Edition), faites simplement un clic droit sur le groupe Cert C et sélectionnez "List Code Queries of this Group in a dedicated section in Report".

Liste des règles CERT C
CppDepend offre le support de 38 requêtes du standard Cert C.
Pour mieux comprendre chaque règle et son fonctionnement, veuillez consulter Documentation du standard de codage SEI CERT C par la Carnegie Mellon University.
- 2 Préprocesseur (PRE)
- 4 Déclarations et initialisation
- 12 Expressions (Exp)
- 2 Virgule flottante (FLP)
- 3 Tableau (ARR)
- 2 Caractères et chaînes (STR)
- 2 Gestion de la mémoire (MEM)
- 2 Entrée/Sortie (FIO)
- 1 Environnement (ENV)
- 1 Signaux (SIG)
- 1 Gestion des erreurs (ERR)
- 1 Concurrence (CON)
- 2 Divers (MSC)
Préprocesseur (PRE)
PRE30-C : Do not create a universal character name through concatenation:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_ucn_escape_incomplete"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}PRE31-C : Avoid side effects in arguments to unsafe macros:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="bugprone-macro-repeated-side-effects"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Déclarations et initialisation
DCL30-C : Declare objects with appropriate storage durations:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="danglingLifetime"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}DCL31-C : Déclarez les identifiants avant de les utiliser :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="err_missing_type_specifier"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}DCL37-C : Do not declare or define a reserved identifier:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_pp_macro_is_reserved_id" select
new { issue,issue.FilePath,Line=issue.BeginLine}DCL41-C : Do not declare variables inside a switch statement before the first case label:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.Type=="Rule6-4-4"
select new { issue,issue.FilePath,Line=issue.BeginLine}Expressions (Exp)
EXP30-C : Do not depend on the order of evaluation for side effects:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_unsequenced_mod_use" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP32-C : Do not access a volatile object through a nonvolatile reference:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang"
&& issue.Type=="err_typecheck_convert_incompatible_volatile" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP33-C : Ne lisez pas de mémoire non initialisée :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && (issue.Type=="uninitvar" || issue.Type=="uninitdata") select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP34-C : Ne déréférencez pas de pointeurs nuls :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="nullPointer" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP35-C : Do not modify objects with temporary lifetime:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang"
&& issue.Type=="err_typecheck_expression_not_modifiable_lvalue" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP36-C : Do not cast pointers into more strictly aligned pointer types:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_cast_align" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP37-C : Call functions with the correct number and type of arguments:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="err_typecheck_call_too_many_args" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP39-C : Do not access a variable through a pointer of an incompatible type:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="invalidPointerCast" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP40-C : Ne modifiez pas d’objets constants :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="err_typecheck_convert_incompatible_const" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP44-C : Do not rely on side effects in operands to sizeof,\_Alignof, or \_Generic:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_side_effects_unevaluated_context"
&& issue.Description.Contains(("lambda")) select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP45-C : Do not perform assignments in selection statements:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_condition_is_assignment" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP46-C. Do not use a bitwise operator with a Boolean-like operand :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_precedence_bitwise_rel" select
new { issue,issue.FilePath,Line=issue.BeginLine}Virgule flottante (FLP)
FLP30-C : Do not use floating-point variables as loop counters:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="cert-flp30-c"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}FLP34-C : Ensure that floating-point conversions are within range of the new type:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_impcast_float_integer"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Tableau (ARR)
ARR30-C. Do not form or use out-of-bounds pointers or array subscripts :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="arrayIndexOutOfBounds"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}ARR36-C : Do not subtract or compare two pointers that do not refer to the same array:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="comparePointers"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}ARR39-C : Do not add or subtract a scaled integer to a pointer:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_ptr_arith_exceeds_bounds"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Caractères et chaînes (STR)
STR30-C : Do not attempt to modify string literals:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="stringLiteralWrite"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}STR34-C : Cast characters to unsigned char before converting to larger integer sizes:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="bugprone-signed-char-misuse"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Gestion de la mémoire (MEM)
MEM30-C : N’accédez pas à la mémoire libérée :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="nullPointer"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}MEM31-C. Free dynamically allocated memory when no longer needed :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_mismatched_delete_new"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Entrée/Sortie (FIO)
FIO38-C : Ne copiez pas d’objet FILE :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="cert-fio38-c"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}FIO42-C : Close files when they are no longer needed:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="resourceLeak"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Environnement (ENV)
ENV33-C : N’appelez pas system() :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="nullPointer"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Signaux (SIG)
SIG30-C : Call only asynchronous-safe functions within signal handlers:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="bugprone-signal-handler"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Gestion des erreurs (ERR)
ERR34-C : Detect errors when converting a string to a number:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="cert-err34-c"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Concurrence (CON)
CON36-C. Wrap functions that can spuriously wake up in a loop :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="bugprone-spuriously-wake-up-functions"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Divers (MSC)
MSC30-C : Do not use the rand() function for generating pseudorandom numbers:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="cert-msc30-c"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}MSC32-C : Properly seed pseudorandom number generators:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang-Tidy" && issue.Type=="cert-msc32-c"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Essayez CppDepend aujourd'hui
Commencez votre essai gratuit de 14 jours avec accès complet à toutes les fonctionnalités de documentation. Sans carte bancaire.
