c - 为什么静态变量中的溢出会导致段错误而不是全局变量?

标签 c gcc buffer-overflow

为什么代码会因第一组代码的段错误而失败,而第二组代码却不会? (唯一的区别是字符在第一个中是静态的,而在第二个中不是静态的)。

#include <string.h> 
#include <stdio.h>
static char a[16];
static char b[16];
static char c[32];
int main(int argc, char *argv[]) {
    strcpy(a, "0123456789abcdef");
    strcpy(b, "0123456789abcdef");
    strcpy(c, a);
    strcat(c, b); 
    printf("a = %s\n", a);
    return 0;
}

.

#include <string.h> 
#include <stdio.h>
char a[16];
char b[16];
char c[32];
int main(int argc, char *argv[]) {
    strcpy(a, "0123456789abcdef");
    strcpy(b, "0123456789abcdef");
    strcpy(c, a);
    strcat(c, b); 
    printf("a = %s\n", a);
    return 0;
}

起初我以为是因为它们的存储位置,但它们都在 bss 区域(全局和未初始化)。 根据我在 Stackoverflow 上的理解和阅读,所有 static 所做的就是将变量限制为内部链接,但仅此而已。

(我知道空字符没有分配空间,这个行为是一致的)

最佳答案

只是因为运气。每当您越过数组定义限制的边界(无论是静态的还是全局的,无论如何),C 中都没有数组边界检查,因此,您可能会或可能不会遇到运行时违规,运气因素来了在。 您需要分配额外的空间,包括字符串空终止符:

char a[16+1];
char b[16+1];
char c[32+1];

关于c - 为什么静态变量中的溢出会导致段错误而不是全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29505715/

相关文章:

java - 如何从n组不同大小的数字中选择n个数字?

c - 如何检查用户输入的字符串是否与某些内容相同

gcc - 找不到/usr/lib64/libstdc++.so.6

gcc - 什么是计算机科学中的目标架构?

c++ - WSARecv,Completionport Model,如何管理Buffer并避免溢出?

c - OpenMPI 1.4.3 mpirun 主机文件错误

c - K&R 第 6 章中的 strdup() 在未分配 sizeof(char) * strlen(s) 位时如何工作?

c# - 在程序中运行 gcc 的安全、跨平台方式

c - GCC如何检测堆栈缓冲区溢出

java - 在java中处理输入流溢出(零窗口)