【问题标题】:How to prevent undefined behavior, from a user/new developer perspective? [closed]从用户/新开发人员的角度来看,如何防止未定义的行为? [关闭]
【发布时间】:2016-06-17 08:01:28
【问题描述】:

所以问题是,原始开发人员如何防止用户/新开发人员尝试访问 空闲 的内存元素的情况。

int *num=(int *)malloc(n*sizeof(int));
int i;
for(i=0;i<n;i++)
{
 scanf("%d",&num[i]);        
}    

for(i=0;i<n-1;i++){
temp = some_function(x);        
} 

free(num);

for(i=0;i<n;i++)
{
  printf("\nnum[%d]= %d\n",i,num[i]);        
}

P.S.:上面的代码有效,实际上打印出数组中的数据。这不是我们的意图。 [编辑] 对不起,如果我不够清楚。有人建议将此作为一个单独的问题提出,我想为什么不呢。这是original post

【问题讨论】:

  • 上面的代码有效,实际上打印出数组中的数据。..欢迎来到 UB。
  • 代码在一个特定平台上工作,可能在调试版本中。在不同的系统(或发布版本)上运行这个可能会崩溃。这取决于内存分配器。一些分配器在释放后会归零(或将所有字节设置为其他值),因此您会得到不同的结果。
  • 请说明您的具体问题或添加其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。请参阅“如何提问”页面以获得澄清此问题的帮助。
  • 不要用锤子敲打拇指来防止拇指受伤。通过不编写错误代码来防止未定义的行为。

标签: c memory-management heap-memory


【解决方案1】:

您的代码“有效”这一事实是您在读取不再拥有的内存时遇到的未定义行为的表现。

您可以考虑在第一次调用free 后将num 设置为NULL。然后写num[i] 几乎肯定会使程序崩溃。它有时也很有用:使用NULL 调用的free 作为指针传递是无操作的。

不幸的是,您无能为力。

但是,一般来说,将 freed 指针设置为 NULL 会导致编程草率,所以我倾向于避免它。

【讨论】:

    【解决方案2】:

    您可以做的第一件事是设置 num=NULL。

    更一般地,您可以添加一个 malloc 挂钩,以便在释放内存之前将垃圾写入内存(可能仅用于调试)。如果在这种情况下访问释放的内存时内存包含指针或打印垃圾,这将强制崩溃。

    另外,既然您说的是 C++,请使用智能指针。

    编辑:修复了崩溃问题。

    【讨论】:

    • 垃圾值比已经存在的值如何使程序崩溃?
    • @4386427 它可能不会使程序崩溃,但会阻止对原始数据的访问,从而更容易发现错误。
    • 抱歉,当内存包含指针时,我正在考虑更一般的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2023-04-07
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多