前幾天我問了一個關於緩衝區溢出檢測的問題(sprintf buffer global data overflow - how to detect it, Windows),問題只能通過cppcheck用標準函數(不安全_s版本)解決。全局緩衝區溢出,Windows環境
我去更深,改變代碼
#include <stdio.h>
char buffer[2];
void main()
{
sprintf(buffer,"12345");
}
到
#include <stdio.h>
void f(char *b)
{
sprintf(b,"12345");
}
char buffer[2];
void main()
{
f(buffer);
}
的Visual Studio 2012/RTC可以處理堆棧分配的緩衝區溢出 - 在運行時,但全球數據撐未被發現。
我想這是不可能使用cppcheck進行深入分析,並且cppcheck-1.64未檢測到此問題。此外,我嘗試使用AddressSanitizer(Windows)的clang也沒有好的結果。
是可以防止Windows下的這些問題(免費工具最好),如果不是一些Linux工具可以幫助?
總的來說,我發現只是沒有超過緩衝區的末端就簡單了。 –
通常開發人員不會故意製造錯誤:) – bataliero1234