当前位置: 首页 > 面试题库 >

无效的读/写有时会导致分段错误,有时不会

张建华
2023-03-14
问题内容

示例代码:

int main ()
{
  char b[] = {"abcd"};
  char *c = NULL;
  printf("\nsize: %d\n",sizeof(b));
  c = (char *)malloc(sizeof(char) * 3);
  memcpy(c,b,10);   // here invalid read and invalid write
  printf("\nb: %s\n",b);
  printf("\nc: %s\n",c);

  return 0;
}

代码中,我已经执行了一些无效的读取和无效的写入,但是这个小程序可以正常工作,并且不会创建core dump

但是一旦进入我的大库,每当我进行1个字节的无效读取或无效写入时,它总是在创建核心转储。

题:

为什么有时我会通过无效的读/写操作获得核心转储,而有时却没有获得核心转储?


问题答案:

您想要做的基本上是缓冲区溢出&在您的代码示例中,更具体地说是堆溢出。您有时只看到崩溃的原因取决于您正在访问的内存区域以及您是否有权访问/写入它(Dan
Fego对此做了很好的解释)。我认为Dan
Fego提供的示例更多地是关于堆栈溢出(欢迎更正!)。gcc具有与堆栈上的缓冲区溢出(堆栈粉碎)相关的保护。您可以在以下示例中看到此消息(基于堆栈的溢出):

#include <stdio.h>
#include <string.h>

int main (void)
{
    char b[] = { "abcdefghijk"};
    char c [8];
    memcpy (c, b, sizeof c + 1);      // here invalid read and invalid write
    printf ("\nsize: %d\n", sizeof b); 
    printf ("\nc: %s\n", c); 
    return 0;
}

样本输出:

$ ./a.out

size: 12

c: abcdefghi���
*** stack smashing detected ***: ./a.out terminated

可以使用-fno-stack-protectorgcc中的选项禁用此保护。
缓冲区溢出是导致安全漏洞的主要原因之一。不幸的是,像memcpy这样的功能不能检查这类问题,但是有一些方法可以防止此类问题。
希望这可以帮助!



 类似资料:
  • 我有一个ColdFusion事件网关,有时会在以下行产生错误(其中Local.cur线程是数字1-5): 错误是: 消息:超时值为负。类型:java。lang.IllegalArgumentException 这是StackTrace: Java语言lang.IllegalArgumentException:java的超时值为负。lang.Object。在coldfusion上等待(本机方法)。运

  • 我正在使用Androidncoder生成一个带有AAC音频的H264视频,通过RTMP网络发送,并使用MediaMuxer本地存储在MP4文件中。 广播在RTMP上运行良好,但在本地保存时,生成的视频有时还可以,有时只是带有声音的黑色帧(或者只是带有一些信息块的第一部分帧),有时它先播放音频,然后以随机FPS速度播放视频。 这是我的Muxer包装器类和MPEG4Writer SDK类显示的输出:

  • 问题内容: 根据手册页: 返回值 成功完成后,将返回0。否则,将返回并且设置全局变量以指示错误。在任何一种情况下,对该流的任何进一步访问(包括对的另一个调用)都会导致未定义的行为。 错误 底层的文件描述符无效。 该函数也可能会失败,并设置为例程指定的任何错误,或者。 当然应该失败,但是我希望它以正常方式返回,而不是直接因分段错误而死亡。是否有任何这种行为的原因? 提前致谢。 更新:我将把代码放在这

  • 下面的错误会不时弹出,但并不总是在同一个地方。不太清楚为什么。有线索吗?这里的完整代码:完整代码 文件“/users/davidkasapchuk/pycharmprojects/test/homedepotfridges.py”,第257行,在price=item.find_element_by_class_name('product-display-price')文件“/library/fra

  • 在本例中,我在一个包含2个副本的部署中运行“echoheaders”Nginx。当我删除一个pod时,我有时会收到约40秒的缓慢响应和错误。 我们正在库伯内特斯运行我们的API网关,并且需要能够允许库伯内特斯调度程序在它认为合适的时候处理pod。 我们最近想引入会话相关性,为此,我们想迁移到新的闪亮的NEG:网络endpoint组:https://cloud.google.com/load-bal

  • 在我的Vaadin应用程序中,当Vaadin在“session Timeout”消息之后没有使会话无效时,我遇到了一个问题。收到此消息后,用户有时可以单击链接或刷新页面,并继续工作,就像他们仍在登录一样。我使用以下参数: Last参数(session-timeout)也在context.xml(session-timeout=900)和web.xml(session-config/session-