潜在的释放后使用¶
ID: cpp/use-after-free
Kind: path-problem
Security severity: 9.3
Severity: warning
Precision: high
Tags:
- reliability
- security
- external/cwe/cwe-416
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
此规则查找通过已释放的内存位置的指针进行访问(即通过悬空指针进行访问)。此类内存块已释放回动态内存管理器,修改它们会导致从段错误到内存损坏,进而会导致后续对动态内存管理器的调用出现错误,甚至可能导致安全漏洞。
警告:此检查是一个近似值,因此某些结果可能不是程序中的实际缺陷。通常,在不使用所有输入数据运行程序的情况下,无法计算指针的值。
建议¶
确保所有通过指针访问内存的执行路径,在指针被释放之后都不会访问该指针。
示例¶
void f() {
char* buf = new char[SIZE];
...
if (error) {
delete buf; //error handling has freed the buffer
}
...
log_contents(buf); //but it is still used here for logging
...
}
参考¶
I. Gerg。*缓冲区溢出攻击概述和示例*。IANewsletter 第 7 卷第 4 期。2005 年。
M. Donaldson。*缓冲区溢出攻击内部:机制、方法和预防*。SANS Institute InfoSec 阅读室。2002 年。
通用弱点枚举:CWE-416.