【发布时间】:2016-11-13 04:19:47
【问题描述】:
如果我添加命令行参数或注释掉调用cpy 函数,为什么此代码在定期运行时会产生段错误,但未定义行为而不是段错误?
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
int *p;
void fn() {
int n[1];
n[0]=99;
p = n;
}
void cpy(char *v) {
char x[8];
strncpy(x,v,8);
}
int main(int argc, char** argv) {
fn();
cpy(argv[1]);
cout << "p[0]:" << p[0];
}
我知道n 是函数fn 的本地变量,但是有没有办法让缓冲区溢出或输入argv[1] 的内容以使其打印n 从任何地方保存的值它在/曾经在内存中吗?
【问题讨论】:
-
未定义的行为?如果添加命令行参数,它会存储在 argv[1] 中。如果你注释掉 cpy() 行,你就没有在任何地方使用 argv[1],这就是导致段错误的原因。
-
但是为什么不使用
argv[1]会导致段错误?我的意思是未定义的行为打印p的索引,它指向一个超出范围的变量。 -
等等,就像不提供命令行参数,或者不使用变量 argv[1]?
-
嗯,是的,为什么添加命令行 arg 使得尝试打印空指针不再导致段错误?我不知道
argv对打印指针有何影响。 -
它没有。尝试访问 argv[1] 时,在尝试打印指针之前发生段错误。
标签: c++ segmentation-fault undefined-behavior buffer-overflow