Startseite/Dokumentation/Coding-Standards/CERT-C++-Konformität nahtlos erreichen mit CppDepend

CERT-C++-Konformität nahtlos erreichen mit CppDepend

CERT-C++-Konformität nahtlos erreichen mit CppDepend

In der heutigen wettbewerbsintensiven Softwareentwicklungslandschaft ist die Pflege von hochwertigem und sicherem Code unerlässlich. Der Cert-C++-Coding-Standard dient als Richtlinie für die Erstellung zuverlässiger und sicherer C++-Anwendungen. Aber wie können Entwickler Cert-C++-Compliance in ihren Projekten effizient erreichen?

Hier kommt CppDepend ins Spiel, ein umfassendes Werkzeug, das speziell dafür entwickelt wurde, Ihnen bei der Bewältigung der Komplexität des Cert-C++-Standards zu helfen. Durch den Einsatz statischer Analysetechniken führt CppDepend Sie nicht nur zur Compliance, sondern befähigt Sie auch, die allgemeine Codequalität und -sicherheit zu verbessern.

Um die CERT-C++-Standards kennenzulernen, können Sie dieses Dokumentation zum SEI CERT C++ Coding Standard von Aaron Ballman.

Verwenden von CERT-C++-Regeln in CppDepend

Wenn Sie ein neues CppDepend-Projekt erstellen, erscheint ein Pop-up, das alle Coding-Standards anzeigt, die Sie in Ihre Analyse aufnehmen möchten. Um Cert-C++-Coding-Standards einzuschließen, aktivieren Sie die Cert-Option und wählen Sie Cert C++.

Nach der Analyse Ihres Projekts navigieren Sie zum Abschnitt Queries and Rules Explorer und wählen im linken Menü die Cert-C++-Regeln (im Bild unten rot hervorgehoben). Dadurch werden rechts alle zugehörigen Cert-C++-Regeln angezeigt. Beim Klicken auf eine Regel werden automatisch die entsprechende CQLinq-Abfrage und der relevante Quellcode generiert. Zusätzlich bietet der Abschnitt Metrics View eine Visualisierung des Ortes und der Bedeutung des Problems.

Einbindung der CERT-C++-Regeln in den HTML-Bericht

Um die Cert-C++-Regeln in den generierten HTML-Bericht aufzunehmen (verfügbar in der DevOps Edition), klicken Sie einfach mit der rechten Maustaste auf die Cert-C++-Gruppe und wählen Sie "List Code Queries of this Group in a dedicated section in Report".

Liste der CERT-C++-Regeln

CppDepend unterstützt 38 CERT-C++-Standardabfragen.

Um ein tieferes Verständnis jeder Regel und ihrer Funktionsweise zu erhalten, konsultieren Sie bitte Dokumentation zum SEI CERT C++ Coding Standard von Aaron Ballman.

Deklarationen und Initialisierung

DCL50-CPP: Do not define a C-style variadic function:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

warnif **count** > **0**
from m in **JustMyCode**.Methods where m.IsVariadic
select m

DCL51-CPP: Do not declare or define a reserved identifier:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

warnif **count** > **0**
from n in **JustMyCode**.Methods.Where(m=>m.SimpleName=="operatornew")  where  **JustMyCode**.Methods.Where(m=>m.SimpleName=="operatordelete").Count()==**0**
select n

DCL57-CPP: Do not let exceptions escape from destructors or deallocation functions:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

warnif **count** > **0** from codeElement  in **JustMyCode**.CodeElements  where codeElement.Parents.Where(t=>t.IsNamespace && t.Name=="std").Count()>**0**
select codeElement

DCL59-CPP: Do not define an unnamed namespace in a header file:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

warnif **count**>**0** from n in **Namespaces**
where n.Name.StartsWith("anonymous_namespace") && n.Name.Contains(".h")
select n

Ausdrücke (Exp)

EXP50-CPP: Do not depend on the order of evaluation for side effects:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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: Lesen Sie keinen nicht initialisierten Speicher:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

warnif **count** > **0**
from m in **JustMyCode**.Methods where
m.IsUsing("Keywords.const_cast".AllowNoMatch()) select m

EXP57-CPP: Do not cast or delete pointers to incomplete classes:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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}

Speicherverwaltung (MEM)

MEM50-CPP: Greifen Sie nicht auf freigegebenen Speicher zu:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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
}

Ausnahmen und Fehlerbehandlung (ERR)

ERR51-CPP: Behandeln Sie alle Ausnahmen:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

warnif **count** > **0**
from m in **JustMyCode**.Methods where m.IsEntryPoint
&& m.IsUsing("Keywords.generic_catch".AllowNoMatch()) select m

ERR52-CPP: Verwenden Sie nicht setjmp() oder longjmp():

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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
}

Objektorientierte Programmierung (OOP)

OOP50-CPP: Do not invoke virtual functions from constructors or destructors:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

from m in **JustMyCode**.Methods.Where(m=>(m.IsConstructor || m.IsDestructor)
&& m.MethodsCalled.Where(s=>s.IsVirtual).Count()>**0**)
select m

OOP52-CPP: Do not delete a polymorphic object without a virtual destructor:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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
}

Sonstiges (MSC)

MSC50-CPP: Do not use std::rand() for generating pseudorandom numbers:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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
}

Container

CTR50-CPP: Guarantee that container indices and iterators are within the valid range:

Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:

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
}

Testen Sie CppDepend noch heute

Starten Sie Ihre 14-tägige kostenlose Testversion mit vollem Zugriff auf alle Dokumentationsfunktionen. Keine Kreditkarte erforderlich.