由于 malloc 大小不正确导致的不确定性故障?

     2023-02-16     69

关键词:

【中文标题】由于 malloc 大小不正确导致的不确定性故障?【英文标题】:nondeterministic failures due to incorrect malloc size? 【发布时间】:2013-10-03 12:12:51 【问题描述】:

我们是否有示例说明由于 C 中的 malloc 大小不正确而导致的非确定性故障?

例如,在我的 linux 'gzip' 程序中:

.
.
.
char* a = (char*)malloc(256) // correct version 
is changed to
char* a = (char*)malloc(206) //faulty version
.
.
.

因此,传递正确版本的测试用例 tc 在错误版本上变为失败(即分段错误)。 但是,失败是不确定的。有时,错误版本上的失败测试用例 tc 不会导致分段错误(即通过)。

这可能是由于 malloc 的“未定义”行为,但我不知道它究竟是如何发生的。

谁能给我一些具体的例子? 提前谢谢你。

【问题讨论】:

Please don't cast the return value of malloc() in C. 【参考方案1】:

将内存想象成一系列页面。有些可用于您的流程,有些因权限而不可用,有些根本无法访问,即未映射。考虑这张地图(不按比例):

      +                        +   +
      |   Page, 4096 bytes     |   |
      +-----------------+------+   |
      |                 |      |   |
      |                 |      |   |
      |                 |      |   |
      +-----------------+------+-->v
           3890B          206B   X <-- Not mapped, can't touch!

如果你分配 206 个字节,这一切都取决于这 206 个字节在页面中的位置。

如果它们位于开头(左侧),则访问更多就可以了 关注 Linux(但就 C 而言仍然是未定义的行为)

但如果访问更多字节溢出到另一个页面,则使用不同的 保护或进入未映射的保护,Linux 不会被逗乐,你会得到一个段错误

因此,您受制于无法控制的事情:malloc 将分配您的数据的位置,即额外 50 个字节的位置。

【讨论】:

@freddy 暂时不要接受,也许会有更好的东西出现。【参考方案2】:

这不是 malloc 的未定义行为。它只是为您提供所需的内存。

您稍后可能会访问非保留内存(例如a[208] = 'x';),这将导致未定义的行为。

C 标准说:

未定义的行为

行为,在使用不可移植或错误的程序结构或错误数据时, 本国际标准对此没有要求

这意味着任何事情都可能发生。你无法预测结果,必须始终避免这种情况。

【讨论】:

谢谢,但什么是“未定义的行为”?它是如何导致不确定性失败的? Undefined Behaviour 在这里您可以了解更多关于 UB。

导航菜单大小不正确

】导航菜单大小不正确【英文标题】:Navmenudoesn\'tsizeproperly【发布时间】:2022-01-2313:30:08【问题描述】:我目前在使用此导航栏时遇到了一些问题。电脑版的效果很好,虽然移动版的菜单宽度似乎有点太大,导致导航中的所有项... 查看详情

由于 Direct X 版本不正确导致的编译错误

】由于DirectX版本不正确导致的编译错误【英文标题】:CompilationErrorduetoInCorrectDirectXVersion【发布时间】:2011-10-1205:13:53【问题描述】:我获得了用于从摄像机捕获视频的示例项目。我正在尝试编译它。我正在使用Windows7和vs2008。... 查看详情

因打印日志而引发的故障(代码片段)

...说是血的教训了。两次故障的原因也是非常的相似,都是由于其他业务系统调用了另外一个老系统的接口,但是由于传递的参数不正确,而老系统会因为参数不正确而打印日志。当错误的请求量增大,打印日志会造成当前线程阻... 查看详情

笔记本开机一直显示这样是怎么回事?

...通常表示你的计算机无法找到可引导的操作系统。可能是由于硬盘故障、操作系统文件系统损坏或启动顺序设置不正确等原因导致。以下是一些可能的解决方法:检查硬盘连接:可能是硬盘接触不良或者数据线松动导致的问题。... 查看详情

由于舍入行为导致的浮点数和不正确的结果

】由于舍入行为导致的浮点数和不正确的结果【英文标题】:Floatpointnumbersandincorrectresultduetoroundingbehavior【发布时间】:2016-11-0203:44:49【问题描述】:我需要输出小数点后两位的浮点数。此外,我还需要对数字进行四舍五入。但... 查看详情

由于 UNION 导致的视图和表列大小不匹配

】由于UNION导致的视图和表列大小不匹配【英文标题】:ViewandTableColumnSizemismatchduetoUNION【发布时间】:2020-04-1311:28:59【问题描述】:我使用联合CVAS创建了视图:CREATEORREPLACEVIEWSAMPLEVIEWASSELECTPT.CREDITPARTYACCOUNTASPT_CREDITPARTYACCOUNT,PT.DEBI... 查看详情

由于网页对窗口大小的解释不正确,媒体查询失败

】由于网页对窗口大小的解释不正确,媒体查询失败【英文标题】:mediaqueryfailingduetoincorrectwindowsizeinterpretationbywebpage【发布时间】:2019-07-1021:23:13【问题描述】:我正在创建一个响应式网页,旨在显示在不同的屏幕尺寸上。我... 查看详情

常见小票打印机打印故障及解决方法汇总视频教程

...障:【小票打印机不打印故障】1、电脑系统参数设置不正确导致小票打印机不打印故障2、端口不正确导致不打印故障3、属性参数不正确导致不打印故障4、红灯一直闪烁不打印故障5、打印机图标突然消失不打印故障6、默认打印... 查看详情

电脑关机时出现内存错误

...提示信息,表示检测内存时出现故障。引起该故障多半是由于使用了不同品牌或不同工作频率的内存条,从而导致兼容性问题,亦有可能是内存插槽出现问题。【故障处理】根据可能引起故障的不同原因,可通过下面的方法解决... 查看详情

c语言中怎么随输入确定数组大小,最好有实例

...,其实还是有可能是实现的。#include<stdio.h>#include<malloc.h>main()intlen,i;int*pArr;printf("请输入数组的元素个数:\n");scanf("%d",&len);pArr=(int*)malloc(4*len);printf("为数组赋值:\n");for(i=0;i<len;i++)printf("... 查看详情

如何解决由于 PyTorch 中大小不匹配导致的运行时错误?

】如何解决由于PyTorch中大小不匹配导致的运行时错误?【英文标题】:HowtoresolveruntimeerrorduetosizemismatchinPyTorch?【发布时间】:2018-09-1109:17:46【问题描述】:我正在尝试使用PyTorch实现一个简单的自动编码器。我的数据集由256x256x3... 查看详情

如何预先确定malloc的大小以连接字符串数组?(代码片段)

...法修改数组参数。char*append(char*data[]);我不明白如何确定malloc指针的大小。答案首先,要知道一个字符串的大小,您可以使用库strlen中的string.h。如果你想计算所有大小的总和,你可以使用一个循环并总结所有的strlens,并为终端1... 查看详情

添加多个提醒会导致它们同时触发

...完整的问题描述,因为我不确定解决方案背后的逻辑是否正确,但我很确定这与我自己设置警报的方式有关不准确,或者有时只是纯粹的故障(警报根本不会触发)。用户可以从药物列表中添加新药物。屏幕1当找到某种药物时... 查看详情

tcl错误代码01401-1

tcl错误代码01401-1一般是由于电视机当前的网络不通引起的,解决方法如下:1、电视机系统运行出错导致网络不通,一般重启电视机就可以解决;2、检查电视机的网络连接是否有问题,如果是有线连接则检查网络端口的线路连接... 查看详情

电脑经常忽然卡屏不动然后蓝屏

...来说,超频过度是导致蓝屏的一个主要原因。过度超频,由于进行了超载运算,造成内部运算过多,使cpu过热,从而导致系统运算错误。如果既想超频,又不想出现蓝屏,只有做好散热措施了,换个强力风扇,再加上一些硅胶之... 查看详情

修复可能由于 STM32 Nucleo-F334R8 上的 malloc 导致的内存覆盖错误

】修复可能由于STM32Nucleo-F334R8上的malloc导致的内存覆盖错误【英文标题】:FixingaMemoryOverwriteerrorslikelyduetomalloconanSTM32Nucleo-F334R8【发布时间】:2019-09-1612:17:51【问题描述】:我希望这是对我的问题的清晰解释,我已经围绕各种手... 查看详情

iOS 8 上的 snapshotViewAfterScreenUpdates 故障

...,运行此程序会导致视图(或主窗口,不确定)暂时调整大小(不传递iPhone6/6的启动图像+):[self.viewsnapsh 查看详情

Datetime 隐式转换为 Datetimeoffset 会导致不正确的偏移量?

】Datetime隐式转换为Datetimeoffset会导致不正确的偏移量?【英文标题】:DatetimeimplicitconversiontoDatetimeoffsetresultsinincorrectoffset?【发布时间】:2016-03-1120:21:08【问题描述】:在尝试确定给定的datetimeoffset是否发生在时区调整(夏令时... 查看详情