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 découvrir les standards CERT C++, vous pouvez imprimer ce Documentation du standard de codage SEI CERT C++ par Aaron Ballman.
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 Aaron Ballman.
Déclarations et initialisation
DCL50-CPP : Do not define a C-style variadic function:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from m in **JustMyCode**.Methods where m.IsVariadic
select mDCL51-CPP : 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}DCL52-CPP : Never qualify a reference type with const or volatile:
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_invalid_reference_qualifier_application" select
new { issue,issue.FilePath,Line=issue.BeginLine}DCL53-CPP : Do not write syntactically ambiguous declarations:
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_empty_parens_are_function_decl" select
new { issue,issue.FilePath,Line=issue.BeginLine}DCL54-CPP : Overload allocation and deallocation functions as a pair in the same scope:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from n in **JustMyCode**.Methods.Where(m=>m.SimpleName=="operatornew") where **JustMyCode**.Methods.Where(m=>m.SimpleName=="operatordelete").Count()==**0**
select nDCL57-CPP : Do not let exceptions escape from destructors or deallocation functions:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="exceptThrowInDestructor" select
new { issue,issue.FilePath,Line=issue.BeginLine}DCL58-CPP : Do not modify the standard namespaces:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from codeElement in **JustMyCode**.CodeElements where codeElement.Parents.Where(t=>t.IsNamespace && t.Name=="std").Count()>**0**
select codeElementDCL59-CPP : Do not define an unnamed namespace in a header file:
Ce standard de codage est calculé avec la requête suivante :
warnif **count**>**0** from n in **Namespaces**
where n.Name.StartsWith("anonymous_namespace") && n.Name.Contains(".h")
select nExpressions (Exp)
EXP50-CPP : 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}EXP52-CPP : Do not rely on side effects in unevaluated operands:
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" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP53-CPP : 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}EXP54-CPP : Do not access an object outside of its 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=="warn_ret_stack_addr_ref" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP55-CPP : Do not access a cv-qualified object through a cvunqualified type:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from m in **JustMyCode**.Methods where
m.IsUsing("Keywords.const_cast".AllowNoMatch()) select mEXP57-CPP : Do not cast or delete pointers to incomplete classes:
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_delete_incomplete" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP58-CPP : Pass an object of the correct type to va\_start:
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_va_start_type_is_undefined" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP61-CPP : A lambda object must not outlive any of its reference captured objects:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="returnDanglingLifetime"
&& issue.Description.Contains(("lambda")) select new { issue,issue.FilePath,Line=issue.BeginLine}EXP62-CPP : Do not access the bits of an object representation that are not part of the object’s value representation:
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_dyn_class_memaccess" select
new { issue,issue.FilePath,Line=issue.BeginLine}Gestion de la mémoire (MEM)
MEM50-CPP : 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
}MEM51-CPP : Properly deallocate dynamically allocated resources:
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
}MEM53-CPP. Explicitly construct and destruct objects when manually managing object lifetime :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="uninitdata"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}MEM56-CPP : Do not store an already-owned pointer value in an unrelated smart pointer:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="doubleFree"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}MEM57-CPP : Avoid using default operator new for over-aligned types:
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-mem57-cpp"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Exceptions et gestion des erreurs (ERR)
ERR51-CPP : Gérez toutes les exceptions :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0**
from m in **JustMyCode**.Methods where m.IsEntryPoint
&& m.IsUsing("Keywords.generic_catch".AllowNoMatch()) select mERR52-CPP : N’utilisez pas setjmp() ou longjmp() :
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="cert-err52-cpp"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}ERR53-CPP : Do not reference base classes or class data members in a constructor or destructor function-try-block handler:
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_cdtor_function_try_handler_mem_expr"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}ERR54-CPP : Catch handlers should order their parameter types from most derived to least derived:
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_exception_caught_by_earlier_handler"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}ERR58-CPP. Handle all exceptions thrown before main() begins executing :
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-err58-cpp"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}ERR60-CPP : Exception objects must be nothrow copynconstructible:
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-err60-cpp"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}ERR61-CPP : Catch exceptions by lvalue reference:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="catchExceptionByValue"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Programmation orientée objet (POO)
OOP50-CPP : Do not invoke virtual functions from constructors or destructors:
Ce standard de codage est calculé avec la requête suivante :
from m in **JustMyCode**.Methods.Where(m=>(m.IsConstructor || m.IsDestructor)
&& m.MethodsCalled.Where(s=>s.IsVirtual).Count()>**0**)
select mOOP52-CPP : Do not delete a polymorphic object without a virtual destructor:
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_delete_non_virtual_dtor"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}OOP53-CPP : Write constructor member initializers in the canonical order:
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_initializer_out_of_order"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}OOP54-CPP : Gracefully handle self-copy assignment:
Ce standard de codage est calculé avec la requête suivante :
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="operatorEqToSelf"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}OOP57-CPP. Prefer special member functions and overloaded operators to C Standard Library functions :
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-oop57-cpp"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}OOP58-CPP : Copy operations must not mutate the source object:
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-oop58-cpp"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Divers (MSC)
MSC50-CPP : Do not use std::rand() 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-msc50-cpp"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}MSC51-CPP. Ensure your random number generator is properlyseeded :
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-msc51-cpp"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Conteneurs
CTR50-CPP : Guarantee that container indices and iterators are within the valid range:
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_array_index_exceeds_bounds"
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.
