【问题标题】:Why is my program snapping out abruptly without any error?为什么我的程序突然弹出而没有任何错误?
【发布时间】:2021-11-02 17:23:10
【问题描述】:

由于指针部分的一些运行时错误,我的代码运行异常。 这是我的代码,因为我犯了错误而表现得很奇怪。

#include<stdio.h>
void swap(int*, int*);
int main()
{
    int a, b;
    printf("Enter the value of a : ");
    scanf("%d",&a);
    printf("Enter the value of b : ");
    scanf("%d",&b);
    swap(&a,&b);
    printf("Values of a and b after swapping are %d and %d respectively\n",a,b);
}
void swap(int *a, int *b)
{
    int *temp;
    printf("asdf");
    *temp=*a;
    printf("asdf");
    *a=*b;
    *b=*temp;
}

输出是 输入 a 的值:5 输入 b 的值:2 asdf 我错误地将 temp 设为指针变量而不是简单的整数变量。但是为什么我的代码不能继续工作并最终出现在那里?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    swap 中,temp 是一个未初始化的指针,因此您正在破坏内存。但它根本不应该是一个指针。将其更改为:

    void swap(int *a, int *b)
    {
        int temp;
        temp=*a;
        *a=*b;
        *b=temp;
    }
    

    原始代码行为异常的原因是因为它存储到未初始化指针的目标。该指针可以包含任何值,因此写入其目标可以更改内存的任何部分。这被称为未定义的行为。例如,它可以修改返回地址或其他变量。该行为特定于您正在使用的特定编译器、生效的选项等。如果您真的想知道特定编译器发生了什么,您需要查看汇编代码和调用序列看看那个未初始化的指针到底包含什么以及修改它的目标会有什么效果。

    【讨论】:

    • OP 的“我错误地将 temp 设为指针变量而不是简单的整数变量”表明他们已经意识到自己的错误。他们似乎在问为什么这个错误会引发它所造成的特定后果。
    • @JohnBollinger 好点。我用关于写入未初始化指针目标的影响的注释更新了我的答案。
    • 我可能听起来很愚蠢,但是有人可以通过在其位置为空指针分配一些值以从攻击者想要的任何位置终止来毒化此代码吗?
    • @PriyankDave 要做到这一点,攻击者需要有某种方法以某种可预测的方式对程序内存进行意外更改。一个更常见的情况是一个程序将一个字符串输入到一个固定长度的数组中,并且攻击者向它发送一个长字符串,导致数据以某种可预测的方式写入到数组末尾之后。在一个正确编码的程序中,这些都不应该是可能的。
    • 是的,现在编译器已经处理好了。但我只是一个想成为网络安全工程师类型的人,我在大学的这 4 年里正在学习编程和其他编码的东西。所以我一直在思考这样的可能性。 :|
    【解决方案2】:

    为什么我的代码无法继续工作并最终出现在那里?

    你的swap函数使程序拥有undefined behavior

    void swap(int *a, int *b)
    {
        int *temp; // an uninitialized pointer - no memory allocated
    
        *temp=*a;  // assigning to *temp - and temp may be pointing anywhere
    
        *a=*b;
        *b=*temp;
    }
    

    上述分配是导致问题的原因。当一个程序有未定义的行为时,任何事情都可能发生——比如程序的突然终止。

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多