指针段错误vs未定义行为
pointer segfault vs undefined behavior
为什么这段代码在定期运行时产生段错误,但如果我添加命令行参数或注释调用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]==nullptr
。那么cpy(argv[1])
是cpy(nullptr)
, cpy调用strncpy(x,nullptr,8)
和segfaults
如果你注释掉了这个拷贝,那么没有段错误。
如果你传递一个参数,那么copy将不会出现分段错误。但是接下来你会遇到一个不同的问题:fn执行了p=n
,但n是在堆栈上声明的,所以回到cout<<p[0]
的main中,p指向对象n,而对象n已经不存在了,所以行为是未定义的。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 未定义的引用和运算符 << vs me
- 是 VS 代码 MinGW 与 Win32 中未定义的错误
- 标识符"DDRB"未定义 - VS code / Visual Studio
- 静态库中未定义的符号,但在同一 VS 解决方案中存在
- 指针段错误vs未定义行为
- c/c++中的未定义行为:i++ + ++i vs ++ i++ i++