Microsoft 的 strncat 读取超出源缓冲区边界的字节

2024-03-19

我观察到 Microsoft 实现中存在一个有趣的问题strncat。它超出了源缓冲区 1 个字节。考虑以下代码:

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

void main()
{
    char dstBuf[1024];
    char* src = malloc(112);
    memset(src, 'a', 112);
    dstBuf[0] = 0;
    strncat(dstBuf, src, 112);
}

strncat在 112 字节块之后读取 1 字节。因此,如果您不幸在无效页面边界上获得分配,您的应用程序就会崩溃。大型应用程序可能会在这些地方间歇性崩溃。 (请注意,这种情况可以用以下方式模拟gflags 页堆环境;块大小必须能被指针大小整除才能正确对齐。)

这是预期的行为还是错误?有任何链接证实这一点吗? (我读了一些描述strncat但它们可以有两种解释,具体取决于您最初的想法......)

Update(回答有关证据的问题): 如果上面的文字不清楚,我深表歉意,但这是一个实验事实。我观察到应用程序间歇性崩溃strncat读取地址src+srcBufSize。在这个小例子中运行gflags 页堆崩溃时一致重现(100%)。据我所知,证据非常确凿。

Update2(有关编译器的信息) MS Visual Studio 2005 版本 8.0.50727.867。 构建平台:64 位版本(32 位没有重现)。 用于重现崩溃的操作系统:Windows Server 2008 R2。

Update 3使用 MS Visual Studio 2012 11.0.50727.1 中内置的二进制文件也会重现该问题

Update 4 Microsoft Connect 上的问题链接 https://connect.microsoft.com/VisualStudio/feedback/details/800199/strncat-reads-bytes-outside-of-source-buffer-range; MSDN 论坛讨论的链接 http://social.msdn.microsoft.com/Forums/vstudio/en-US/6bbdc440-f8d0-48a8-b1a8-08f21aa9e4f5/strncat-reads-bytes-outside-of-source-buffer-range#3ec313ff-4373-4615-aed1-9a13300693f2

Update 5该问题将在下一个 VS 版本中修复。没有计划对旧版本进行修复。请参阅上面的“Microsoft Connect”链接。


The 的文档strncat http://en.cppreference.com/w/cpp/string/byte/strncat states:

src- 指向要复制的以空结尾的字节字符串的指针

因此,实现可以假设src输入参数实际上以 NUL 结尾,即使它长于count人物。

为进一步确认,微软自己的文档 http://msdn.microsoft.com/en-us/library/tbyd7s1y%28v=vs.90%29.aspx states:

字符串源

以 Null 结尾的源字符串。

另一方面,实际的C标准 https://en.wikipedia.org/wiki/C11_%28C_standard_revision%29声明如下:

The strncat函数附加不超过n字符(空字符和 其后面的字符不会从指向的数组中附加)s2到最后 指向的字符串s1.

正如下面的评论所指出的,这标识了第二个参数s2 as an array而不是以 NUL 结尾的字符串。然而,这对于最初的问题来说仍然不明确,因为本文档描述了对的最终影响s1,而不是读取时函数的行为s2.

这当然可以通过以下方式解决:specificMicrosoft通过查阅C Runtime Library源代码来实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Microsoft 的 strncat 读取超出源缓冲区边界的字节 的相关文章

随机推荐

  • Java 中 10,000 以内且 3、5 或 7 的倍数的数字之和

    我知道如何让程序将 3 5 和 7 中每一个的倍数总和相加 但我不确定如何让程序只使用每个数字一次 例如 我可以让程序找出所有数字并将它们相加为 3 然后对 5 执行相同操作 但数字 15 将出现在最终数字中两次 我不确定如何让它只接受一次
  • Spring 验证异常:BindException

    提交表格至addUser控制器发生异常 严重 Servlet DispatcherServlet 的 Servlet service 抛出异常 org springframework validation BindException org
  • 在 yq 中传递 bash 变量

    我正在尝试在 yq 中传递 bash 变量 test yml configuration Properties corporate url https stackoverflow com temp configuration Propert
  • beforeunload 中的 ajax 会可靠执行吗?

    我有一个 HTML5 应用程序 需要在用户更改 刷新页面时发送断开连接 ajax 请求 我目前正在使用这段代码 window addEventListener beforeunload function event ajax url api
  • 如何在asp.net core应用程序中运行ssis包?

    我已经使用 Microsoft SqlServer Dts Runtime 在 ASP NET MVC 中运行包 但是我需要在 asp net core 中运行它 由于我们无法在 ASP NET Core 中添加单独的 DLL 我想知道是否
  • Android 应用程序复制保护和数据文件

    在我的应用程序中 我在代码中的以下硬编码位置访问我的 sqlite 数据库 数据 数据 com mydomain appname databases database db 如果我在 Market Place 中打开复制保护 我的应用程序仍
  • Telegram 机器人:如何隐藏内联键盘? PHP

    我制作了一个带有内联键盘的电报机器人 来自InlineKeyboardMarkup 我喜欢hide 或使其one time 用户响应后的键盘 我怎样才能在 PHP 中做到这一点 这是我的机器人的视图 有方法editMessageReplyM
  • 在 Backbone.js 中使用状态并登录用户

    我需要检查用户是否已登录并经过身份验证 然后才能让我的用户使用我的backbone js基于应用程序 用户身份验证作为属性存储在本机主干模型中 我在启动主路由器之前通过调用进行检查Backbone history start 这样 未经身份
  • 使用 React 内联样式设置背景图像

    我正在尝试访问静态图像以在内联中使用backgroundImageReact 中的属性 不幸的是 我对如何做到这一点已经一无所知 一般来说 我认为你只是做了如下操作 import Background from images backgro
  • 扩展方法中的 ArgumentNullException 或 NullReferenceException?

    在空实例上调用扩展方法 扩展方法不允许 时 您认为抛出的最佳异常类型是什么 由于扩展方法只不过是静态方法 您可能会认为它应该是 ArgumentNullException 但另一方面 它们的使用方式与实例方法类似 因此使用 NullRefe
  • 检测主线程之外的 UI 操作

    注 此问题涉及从后台线程调用 UIKit 时发出警告 https stackoverflow com questions 10976424 warn on calls to uikit from background threads但没有给
  • 如何将进度条连接到函数?

    我正在尝试将进度条连接到我的项目的函数 这是我到目前为止所拥有的 但我很确定它什么也没做 def main pgBar start function1 function2 function3 function4 pgBar stop 这是我
  • Postgresql - 在大数据库中使用数组的性能

    假设我们有一个包含 600 万条记录的表 有 16 个整数列和少量文本列 它是只读表 因此每个整数列都有一个索引 每条记录大约 50 60 字节 表名称为 项目 服务器为 12 GB RAM 1 5 TB SATA 4 核 所有 postg
  • 如何在[关闭]下实现带点的画廊滑动

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何实现画廊下点滑动 我需要显示当前
  • HTML 内容提取的最新技术水平如何?

    有很多关于 HTML 内容提取的学术工作 例如 Gupta Kaiser 2005 从可访问的网页中提取内容 http citeseerx ist psu edu viewdoc summary doi 10 1 1 60 357 以及这里
  • 链接到 CMAKE 中的ExternalProject_add 依赖项

    我在运行 Ninja 时收到以下 ninja 构建错误 我的 CMAKE 构建命令是cmake G Ninja DCMAKE BUILD TYPE Release ninja error ext deps api src ext api b
  • Angular2:表中带有 *ngFor 的复选框

    我有一个 HTML 表 其中每行都有一个关联的复选框 默认情况下 最初会检查所有行
  • 以编程方式查找对象使用的内存

    有没有办法以编程方式准确确定 C 中对象使用的内存量 我不关心这个过程有多慢 所以左右运行 GC 是可以接受的 当然我更喜欢更高效的东西 序列化对象并查看结果长度似乎不太准确 在对此方法的简单测试中 我看到整数返回值 54 Using GC
  • 如何在 PHP 中使用 fetch() API POST 方法抓取数据?

    我正在尝试使用fetch API POST 方法以获取 PHP 中的 POST 数据 这是我尝试过的 var x hello fetch url method post body x then function response retur
  • Microsoft 的 strncat 读取超出源缓冲区边界的字节

    我观察到 Microsoft 实现中存在一个有趣的问题strncat 它超出了源缓冲区 1 个字节 考虑以下代码 include