静态全局变量与全局变量 C
Static global variables vs global variables C
我有下面的程序。如果我将变量 a、b、c 声明为静态全局变量,则会出现分段错误,但如果我将它们声明为非静态全局变量或局部变量,则不会出现分段错误。为什么它会以这种方式表现?我知道变量可以存储的数据比变量多,但是为什么只有声明为静态时才会出现段错误?静态声明的变量是否存储在不允许覆盖的堆栈帧的某些不同部分?
编辑:我知道 strcpy 不安全。但这不是我的问题。我想了解为什么一个溢出会出现段错误,为什么另一个溢出可能不会出现段错误。
#include<stdio.h>
#include<string.h>
static char a[16];
static char b[16];
static char c[32];
int main(int argc, char *argv[]){
// char a[16];
//char b[16];
//char c[32];
strcpy(a,"0123456789abcdef");
strcpy(b,"0123456789abcdef");
strcpy(c,a);
strcpy(c,b);
printf("a = %s\n",a);
return 0;
}
注意 C 中的 const char* 字符串总是以 0 结尾,这意味着字符串“0123456789abcdef”实际上是 17 个字符:"0123456789abcdef[=11=]"
我建议您始终使用安全版本
strncpy()
您还可以查看文档,它明确告诉您包含空字符。
堆栈变量中的内存对齐很重要。
尝试使用 -fstack-protector-strong 或类似的堆栈保护选项,您会看到崩溃。
在 c 之后声明一个 int 并溢出你的数组 c,你可以看到崩溃。
您需要确保没有填充。
因为 b 是一个数组,所以从 'a' 溢出的任何内容都会转到 b。
尝试类似的东西:
struct foo {
char c[10];
int x;
} __attribute__((packed));
当你溢出 c 时你会看到崩溃。
溢出时遇到未定义的行为。
我有下面的程序。如果我将变量 a、b、c 声明为静态全局变量,则会出现分段错误,但如果我将它们声明为非静态全局变量或局部变量,则不会出现分段错误。为什么它会以这种方式表现?我知道变量可以存储的数据比变量多,但是为什么只有声明为静态时才会出现段错误?静态声明的变量是否存储在不允许覆盖的堆栈帧的某些不同部分?
编辑:我知道 strcpy 不安全。但这不是我的问题。我想了解为什么一个溢出会出现段错误,为什么另一个溢出可能不会出现段错误。
#include<stdio.h>
#include<string.h>
static char a[16];
static char b[16];
static char c[32];
int main(int argc, char *argv[]){
// char a[16];
//char b[16];
//char c[32];
strcpy(a,"0123456789abcdef");
strcpy(b,"0123456789abcdef");
strcpy(c,a);
strcpy(c,b);
printf("a = %s\n",a);
return 0;
}
注意 C 中的 const char* 字符串总是以 0 结尾,这意味着字符串“0123456789abcdef”实际上是 17 个字符:"0123456789abcdef[=11=]"
我建议您始终使用安全版本
strncpy()
您还可以查看文档,它明确告诉您包含空字符。
堆栈变量中的内存对齐很重要。 尝试使用 -fstack-protector-strong 或类似的堆栈保护选项,您会看到崩溃。 在 c 之后声明一个 int 并溢出你的数组 c,你可以看到崩溃。 您需要确保没有填充。 因为 b 是一个数组,所以从 'a' 溢出的任何内容都会转到 b。 尝试类似的东西:
struct foo {
char c[10];
int x;
} __attribute__((packed));
当你溢出 c 时你会看到崩溃。
溢出时遇到未定义的行为。