使用 CppDepend 确保 CWE 合规并加强 C/C++ 代码安全
使用 CppDepend 确保 CWE 合规并加强 C/C++ 代码安全
在软件开发领域,遵守安全编码实践对于保护应用程序和系统免受潜在威胁至关重要。实现 CWE(通用弱点枚举)合规是这一过程中的关键一步。CppDepend 为 C/C++ 开发人员提供了强大的解决方案,以确保 CWE 合规,有效加强代码安全性和整体软件质量。
在本指南中,我们将探讨使用 CppDepend 实现 CWE 合规的好处,包括其用于识别和缓解漏洞、提高代码质量以及在您的 C/C++ 项目中推广安全编码实践的强大功能。
在CppDepend中使用CWE规则
创建新的 CppDepend 项目时,会弹出一个窗口,显示您想要包含在分析中的所有编码标准。要包含 CWE 编码标准,请勾选 CWE 选项。

分析项目后,导航到 Queries and Rules Explorer 部分,从左侧菜单中选择 CWE 规则(在下图中以红色突出显示)。这将在右侧显示所有相关的 CWE 规则。单击某条规则时,将自动生成相应的 CQLinq 查询和相关源代码。此外,Metrics View 部分提供问题位置和重要性的可视化。

将CWE规则纳入HTML报告
要在生成的 HTML 报告中包含 CWE 规则(在 DevOps Edition 中可用),只需右键单击 CWE 组并选择“List Code Queries of this Group in a dedicated section in Report”。

CWE规则
Buffer Copy without Checking Size of Input ('Classic Buffer Overflow'):
此编码标准通过以下查询计算:
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}除以零:
此编码标准通过以下查询计算:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="zerodiv" select
new { issue,issue.FilePath,Line=issue.BeginLine}未检查的错误条件:
此编码标准通过以下查询计算:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="zerodiv" select
new { issue,issue.FilePath,Line=issue.BeginLine}通用异常的Catch声明:
此编码标准通过以下查询计算:
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'):
此编码标准通过以下查询计算:
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}重复释放:
此编码标准通过以下查询计算:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="deallocDealloc" select
new { issue,issue.FilePath,Line=issue.BeginLine}使用未初始化变量:
此编码标准通过以下查询计算:
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
}清理不完整:
此编码标准通过以下查询计算:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="resourceLeak" select
new { issue,issue.FilePath,Line=issue.BeginLine}NULL指针解引用:
此编码标准通过以下查询计算:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CppCheck" && issue.Type=="nullPointer" select
new { issue,issue.FilePath,Line=issue.BeginLine}使用过时函数:
此编码标准通过以下查询计算:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CLang" && issue.Type=="warn_deprecated" select
new { issue,issue.FilePath,Line=issue.BeginLine}比较而非赋值:
此编码标准通过以下查询计算:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="CLang" && issue.Type=="warn_unused_comparison" select
new { issue,issue.FilePath,Line=issue.BeginLine}Switch中省略的Break语句:
此编码标准通过以下查询计算:
warnif **count** > **0**
from issue in **ImportedIssues** where issue.ToolName=="Clang" && issue.Type=="warn_unannotated_fallthrough" select
new { issue,issue.FilePath,Line=issue.BeginLine}死代码:
此编码标准通过以下查询计算:
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'):
此编码标准通过以下查询计算:
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
}表达式恒为假:
此编码标准通过以下查询计算:
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
}表达式恒为真:
此编码标准通过以下查询计算:
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:
此编码标准通过以下查询计算:
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
}使用潜在危险函数:
此编码标准通过以下查询计算:
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
}运算符优先级逻辑错误:
此编码标准通过以下查询计算:
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
}