CWE-Konformität sicherstellen und C/C++-Code-Sicherheit stärken mit CppDepend
CWE-Konformität sicherstellen und C/C++-Code-Sicherheit stärken mit CppDepend
In der Welt der Softwareentwicklung ist die Einhaltung sicherer Codierungspraktiken entscheidend, um Anwendungen und Systeme vor potenziellen Bedrohungen zu schützen. Das Erreichen von CWE-Compliance (Common Weakness Enumeration) ist ein wesentlicher Schritt in diesem Prozess. CppDepend bietet C/C++-Entwicklern eine robuste Lösung, um CWE-Compliance sicherzustellen und so Codesicherheit und allgemeine Softwarequalität effektiv zu stärken.
In diesem Leitfaden untersuchen wir die Vorteile der Verwendung von CppDepend für CWE-Compliance, einschließlich seiner leistungsstarken Funktionen zum Identifizieren und Mindern von Schwachstellen, zur Verbesserung der Codequalität und zur Förderung sicherer Codierungspraktiken in Ihren C/C++-Projekten.
Verwenden von CWE-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 CWE-Coding-Standards einzuschließen, aktivieren Sie die CWE-Option.

Nach der Analyse Ihres Projekts navigieren Sie zum Abschnitt Queries and Rules Explorer und wählen im linken Menü die CWE-Regeln (im Bild unten rot hervorgehoben). Dadurch werden rechts alle zugehörigen CWE-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.

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

CWE-Regeln
Buffer Copy without Checking Size of Input ('Classic Buffer Overflow'):
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck"
&& (issue.Type=="bufferAccessOutOfBounds" || issue.Type=="possibleBufferAccessOutOfBounds"
|| issue.Type=="insecureCmdLineArgs"|| issue.Type=="invalidscanf") select
new { issue,issue.FilePath,Line=issue.BeginLine}Division durch Null:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="zerodiv" select
new { issue,issue.FilePath,Line=issue.BeginLine}Nicht geprüfte Fehlerbedingung:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="zerodiv" select
new { issue,issue.FilePath,Line=issue.BeginLine}Deklaration von Catch für generische Ausnahmen:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from m in **Methods** where !m.IsEntryPoint
&& m.IsUsing("Keywords.generic_catch".AllowNoMatch()) select mImproper Release of Memory Before Removing Last Reference ('Memory Leak'):
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && (issue.Type=="memleak" || issue.Type=="memleakOnRealloc"
|| issue.Type=="publicAllocationError"|| issue.Type=="leakNoVarFunctionCall") select
new { issue,issue.FilePath,Line=issue.BeginLine}Double Free:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="deallocDealloc" select
new { issue,issue.FilePath,Line=issue.BeginLine}Verwendung nicht initialisierter Variablen:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="uninitvar"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **10**.ToMinutes().ToDebt(),
Severity =Severity.High
}Unvollständige Bereinigung:
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}NULL-Zeiger dereferenziert:
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}Verwendung veralteter Funktionen:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CLang" && issue.Type=="warn_deprecated" select
new { issue,issue.FilePath,Line=issue.BeginLine}Vergleichen statt Zuweisen:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CLang" && issue.Type=="warn_unused_comparison" select
new { issue,issue.FilePath,Line=issue.BeginLine}Fehlende Break-Anweisung in Switch:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_unannotated_fallthrough" select
new { issue,issue.FilePath,Line=issue.BeginLine}Toter Code:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_unreachable" select
new { issue,issue.FilePath,Line=issue.BeginLine}Assignment to Variable without Use ('Unused Variable'):
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="unreadVariable"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **2**.ToMinutes().ToDebt(),
Severity =Severity.Low
}Ausdruck ist immer falsch:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="knownConditionTrueFalse"
&& issue.Description.Contains("always false")
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **2**.ToMinutes().ToDebt(),
Severity =Severity.Low
}Ausdruck ist immer wahr:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="knownConditionTrueFalse"
&& issue.Description.Contains("always true")
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **2**.ToMinutes().ToDebt(),
Severity =Severity.Low
}Function Call with Incorrectly Specified Arguments:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="preprocessorErrorDirective"
&& issue.Description.Contains("Wrong number")
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **2**.ToMinutes().ToDebt(),
Severity =Severity.Low
}Verwendung potenziell gefährlicher Funktionen:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="dangerousUsageStrtol"
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **2**.ToMinutes().ToDebt(),
Severity =Severity.Low
}Logikfehler bei Operatorrangfolge:
Dieser Coding-Standard wird mit der folgenden Abfrage berechnet:
warnif **count** > **0** from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && (issue.Type=="clarifyCalculation"
|| issue.Type=="clarifyCondition")
select new { issue, issue.FilePath, Line = issue.BeginLine ,
Debt = **2**.ToMinutes().ToDebt(),
Severity =Severity.Low
}Testen Sie CppDepend noch heute
Starten Sie Ihre 14-tägige kostenlose Testversion mit vollem Zugriff auf alle Dokumentationsfunktionen. Keine Kreditkarte erforderlich.
