Startseite/Dokumentation/Coding-Standards/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

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.

CWE-Regelkonfiguration

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-Explorer

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 im Bericht

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 m

Improper 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.