【问题标题】:snprintf that calls malloc, or snprintf that does not call malloc调用 malloc 的 snprintf,或不调用 malloc 的 snprintf
【发布时间】:2011-07-23 22:51:51
【问题描述】:

我需要保证它永远不会调用 malloc 的 snprint 变体。
那是因为这个 snprintf(我们称之为 safe_snprint())会
从 malloc 将失败或死锁的地方调用。

什么更接近真相,1 还是 2?

  1. 在 Windows 上,本机 snprintf 可能会调用 malloc。那么
    我需要提取开源 snprintf.c 并将其称为 safe_snprintf()。或者

  2. 在 Windows 上,本机 snprint 保证永远不会调用 malloc。

如果在某处记录在案,我更喜欢 (2)。谢谢

【问题讨论】:

  • 目前我面前没有 MSVC 资源,但有 no 理由说明 snprintf 永远需要进行任何分配。只需使用基于堆栈的内存即可完成所有需要完成的工作。

标签: winapi stdio


【解决方案1】:

当且仅当格式精度超过 163 个字符时,VC 库 (MSVCRT) 中 _snprintf() 的实现只会在浮点转换上调用 malloc。这适用于 %E %G %A %e %f %g%a 格式说明符。

应该适用于至少从版本 6 开始的所有 MSVCRT 版本。

【讨论】:

    【解决方案2】:

    我无法根据 Windows snprintf 实现找到文档,但 this link 声明可能有理由进行内部 malloc 调用。我也不认为任何标准都禁止开发人员使用它。所以我建议你使用第一种方法。 Here 你可以找到snprintf 实现的列表。

    【讨论】:

      【解决方案3】:

      snprintf() 没有理由调用 malloc()。期间。

      但是,如果不查看源代码,您将无法确定。即使那样你也不能确定它会保持这种状态。

      如果您必须绝对确定,那么您可能想要实现自己的 snprintf()。

      【讨论】:

      • snprintf() 适用于预分配的内存。它不需要自己的记忆。我实际上无法想象它为什么会调用 malloc() 。但你为什么不做一个跟踪? int main(void) { char buff[512]; snprintf(buff,512,"%d %s", 10, "lala"); } 跟踪程序可以告诉你真相。
      • 这仅涵盖一个特定的、小而简单的格式说明符。如果用户打印 120k 长字符串怎么办?如果 call 使用 %$ 说明符怎么办?什么是用户使用 %*.* 说明符?需要访问源才能确定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2019-01-05
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多