<分区>
我在我的程序中越来越多地使用指针,在阅读有关指针的内容时,我发现每一个指南或教程都说不正确地使用指针可能会产生“灾难性”的结果。
现在,我遇到过一些大内存泄漏的情况,指针取消引用错误的指针变量,返回不正确的值,但除此之外,没有发生任何“灾难性”;就像我的电脑和/或其他程序崩溃一样。
有人能给我一个肯定会产生“灾难性”结果的简单代码示例吗?我所说的“灾难性”结果是指可能会干扰其他程序或操作系统并可能导致它们崩溃的代码。
<分区>
我在我的程序中越来越多地使用指针,在阅读有关指针的内容时,我发现每一个指南或教程都说不正确地使用指针可能会产生“灾难性”的结果。
现在,我遇到过一些大内存泄漏的情况,指针取消引用错误的指针变量,返回不正确的值,但除此之外,没有发生任何“灾难性”;就像我的电脑和/或其他程序崩溃一样。
有人能给我一个肯定会产生“灾难性”结果的简单代码示例吗?我所说的“灾难性”结果是指可能会干扰其他程序或操作系统并可能导致它们崩溃的代码。
最佳答案
不正确的指针算法也可能导致灾难,因为边界错误会导致缓冲区溢出,而缓冲区溢出会导致数据损坏,例如堆栈粉碎:
void test_fun(int i)
int x[5];
for (int *p = x; p < x+10; ++p) { // obvious error, some are more subtle
*p = i;
}
return; // execution may resume at address `i`, with entertaining results
}
当然,您可以只调用 strcpy
或 memcpy
[*] 来犯同样的错误,您不必自己进行指针运算。如果攻击者控制了 i
的值(可能是因为它是从输入文件中读取的,并且攻击者制作了一个恶意文件),那么您可能会遇到比崩溃更糟糕的情况。结合更多特定于平台的技巧,攻击者可能能够安排返回到 i
最终结束执行攻击者提供的代码。
[*] 或 strncpy
,或 strlcpy
,或 strcpy_s
,或 std::copy
,之前任何人开始。一旦你以某种方式得到了错误的绑定(bind),那么将错误的绑定(bind)提供给边界检查函数仍然是错误的......
关于c++ - 这些所谓的 'disasters' 指针使用不当会导致什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4508423/