【问题标题】:Get a segmentation fault through argv on purpose故意通过argv获取分段错误
【发布时间】:2013-01-22 14:39:46
【问题描述】:

我想编写一个小程序,用户通过 argv 输入时,会出现分段错误。我对 C 很陌生,但我认为以下代码可以完成这项工作:

int main(int argc, char *argv[])
{
    int bufferSize;
    char * buffer[100];
    unsigned int i;

    if (argc > 1) {
        bufferSize = atoi(argv[1]);
        for (i = 0; i < bufferSize; ++i)
            *( buffer + i ) = i;
    }

    return 0;
}

我的想法是程序初始化(?)一个指向特定大小缓冲区的指针。如果用户然后输入一个大于缓冲区大小的数字,它将写入未初始化的内存,因此得到一个段。过错。这个推理是否正确?

附言。编译时,I get a assignment makes pointer from integer without a castwarning,有人可以告诉我为什么会这样吗?谢谢

【问题讨论】:

  • 写入未分配的内存是未定义的行为,因此它实际上可能不会崩溃。或者它会因总线错误而崩溃,或者可能会发生其他事情。
  • 如果我是你,我会选择*(char *)0 = 0; - 还要注意这是UB,我。 e.您不能期望对程序的行为进行任何推理或解释。
  • (在大多数系统上)缓冲区在堆栈上,所以如果你写到最后你会破坏你的堆栈,而不是写入未分配的内存。

标签: c memory memory-management segmentation-fault


【解决方案1】:

char * buffer[100]; 是一个指针数组,默认指向一些垃圾位置。

在这里*( buffer + i ) = i; 你试图尊重不属于你的区域。

我的猜测是,您想创建一个缓冲区。所以

char buffer[100]; 就够了。

【讨论】:

  • 同意。但只是附带说明:我认为 “不属于你的取消引用区域” 不太正确,即使是 char*[100]。语句*( buffer + i ) = i; 无论如何都会写入第 i 个位置数组,从而覆盖第 i 个指针,而不是取消引用它。所以问题只是类型不兼容:将int分配给char*数组项。
【解决方案2】:

我见过的故意导致分段错误的最传统方法是写信给NULL,例如类似:

*((char *) NULL) = 0;

您可以使用命令行参数作为简单的布尔值来查看是否应该这样做。

请注意,写入NULL 实际上并不能保证会导致崩溃,它只是未定义的行为,所以基本上任何事情都可能发生(包括导致nasal demons)。

警告是因为您有一个指针数组,并尝试将整数分配给数组中的指针。

【讨论】:

  • 智能编译器可能会注意到此赋值导致未定义的行为,而是插入未定义的指令操作码。例如,我曾让 Clang 对我这样做过。
  • 好的,所以基本上没有保证会导致分段错误的方法?
  • @Smajjk 我还没有遇到过不会因分段错误(或类似错误)而崩溃的平台,但实际上并不能保证。
【解决方案3】:

我不会担心写入会导致分段错误。读书就够了。如果缓冲区在堆上,则更有可能导致段错误。对于我来说,对于小于 -10 的负输入,此应用程序相当可靠的段错误。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main(int argc, char* argv[])
{
    static const int array[10] = {0,1,2,3,4,5,6,7,8,9};

    int * const heapArray = malloc(sizeof(array));

    memcpy(heapArray,array,sizeof(array));

    const int index = atoi(argv[1]);

    printf("%i\n",heapArray[index]);

    free(heapArray);
    return 0;   
}

问题是,malloc() 的结果可能比大多数系统请求的大小要大得多。因此,即使对于较大的值,它也不会出现段错误,它只会返回内存中发生的任何内容。

ericu@eric-phenom-linux:~$ ./segfault -5
Segmentation fault (core dumped)
ericu@eric-phenom-linux:~$ ./segfault 11
0
ericu@eric-phenom-linux:~$ ./segfault 100
0
ericu@eric-phenom-linux:~$ ./segfault 100
0
ericu@eric-phenom-linux:~$ ./segfault 1000
0
ericu@eric-phenom-linux:~$ ./segfault 10000
0
ericu@eric-phenom-linux:~$ ./segfault 100000
Segmentation fault (core dumped)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2010-12-08
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多