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 CERT-C-Standards zu lernen, können Sie drucken: Dokumentation zum SEI CERT C Coding Standard von der Carnegie Mellon University.
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 der Carnegie Mellon University.
Präprozessor (PRE)
PRE30-C: Do not create a universal character name through concatenation:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Deklarationen und Initialisierung
DCL30-C: Declare objects with appropriate storage durations:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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: Deklarieren Sie Bezeichner vor ihrer Verwendung:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
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}DCL41-C: Do not declare variables inside a switch statement before the first case label:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.Type=="Rule6-4-4"
select new { issue,issue.FilePath,Line=issue.BeginLine}Ausdrücke (Exp)
EXP30-C: 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}EXP32-C: Do not access a volatile object through a nonvolatile reference:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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: 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}EXP34-C: Dereferenzieren Sie keine Nullzeiger:
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}EXP35-C: Do not modify objects with temporary lifetime:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="invalidPointerCast" select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP40-C: Ändern Sie keine konstanten Objekte:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
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"
&& issue.Description.Contains(("lambda")) select
new { issue,issue.FilePath,Line=issue.BeginLine}EXP45-C:Do not perform assignments in selection statements:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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}Gleitkomma (FLP)
FLP30-C:Do not use floating-point variables as loop counters:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Array (ARR)
ARR30-C. Do not form or use out-of-bounds pointers or array subscripts:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Zeichen und Zeichenfolgen (STR)
STR30-C: Do not attempt to modify string literals:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Speicherverwaltung (MEM)
MEM30-C: 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
}MEM31-C. Free dynamically allocated memory when no longer needed:
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
}Ein-/Ausgabe (FIO)
FIO38-C: Kopieren Sie kein FILE-Objekt:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Umgebung (ENV)
ENV33-C: Rufen Sie system() nicht auf:
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
}Signale (SIG)
SIG30-C: Call only asynchronous-safe functions within signal handlers:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Fehlerbehandlung (ERR)
ERR34-C: Detect errors when converting a string to a number:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Nebenläufigkeit (CON)
CON36-C. Wrap functions that can spuriously wake up in a loop:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Sonstiges (MSC)
MSC30-C: Do not use the rand() function 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-msc30-c"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}MSC32-C: Properly seed pseudorandom number generators:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
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
}Testen Sie CppDepend noch heute
Starten Sie Ihre 14-tägige kostenlose Testversion mit vollem Zugriff auf alle Dokumentationsfunktionen. Keine Kreditkarte erforderlich.
