面试题答案
一键面试- 边界检查 在对数组进行读写操作前,检查索引值是否在有效范围内。例如:
int arr[10];
int index = 15;
if (index >= 0 && index < 10) {
arr[index] = 5;
}
- 使用安全函数
- 字符串操作:避免使用
strcpy
、gets
等不安全函数,改用strncpy
、fgets
。char dest[10]; char src[] = "hello world"; strncpy(dest, src, sizeof(dest) - 1); dest[sizeof(dest) - 1] = '\0';
- 格式化输入:使用
snprintf
代替sprintf
。char buffer[20]; int num = 1234567890; snprintf(buffer, sizeof(buffer), "%d", num);
- 静态分析工具
如
cppcheck
、PClint
等,在编译前扫描代码,检测潜在的缓冲区溢出问题。 - 动态分析工具
- Valgrind:在程序运行时检测内存错误,包括缓冲区溢出。可在Linux环境下使用,例如:
valgrind --leak-check=full./your_program
- 编译器特性
- 栈保护:一些编译器(如GCC)支持栈保护选项(
-fstack-protector
系列),会在函数栈帧中插入保护变量,检测栈上缓冲区溢出。例如:gcc -fstack-protector -o your_program your_program.c