MST

星途 面试题库

面试题:C语言中如何检测缓冲区溢出

在C语言编程中,描述一下常见的检测缓冲区溢出的方法。例如在使用数组存储数据时,如何通过代码逻辑来避免数据写入超出数组边界的情况。
38.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 边界检查 在对数组进行读写操作前,检查索引值是否在有效范围内。例如:
int arr[10];
int index = 15;
if (index >= 0 && index < 10) {
    arr[index] = 5;
}
  1. 使用安全函数
  • 字符串操作:避免使用strcpygets等不安全函数,改用strncpyfgets
    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);
    
  1. 静态分析工具cppcheckPClint等,在编译前扫描代码,检测潜在的缓冲区溢出问题。
  2. 动态分析工具
  • Valgrind:在程序运行时检测内存错误,包括缓冲区溢出。可在Linux环境下使用,例如:
    valgrind --leak-check=full./your_program
    
  1. 编译器特性
  • 栈保护:一些编译器(如GCC)支持栈保护选项(-fstack-protector系列),会在函数栈帧中插入保护变量,检测栈上缓冲区溢出。例如:
    gcc -fstack-protector -o your_program your_program.c