sscanf可能溢出

时间:2014-07-12 15:55:47

标签: c++ c

我和我的朋友最近就以下是否可能触发缓冲区溢出进行了辩论。

我熟悉我遇到的常见'sscanf'功能。但这个似乎与我有点联系,因为我不太确定在这种情况下如何解释格式说明符'%'INT64_FMT,以及什么'sscanf'将写入bot'first'& '第二'变量。

有人有想法吗?

static int hKCMF_SLC(const char *content, int64_t *first, int64_t *second)
{
 return sscanf(content, "Size=%" INT64_FMT "-%" INT64_FMT, first, second);
}

1 个答案:

答案 0 :(得分:6)

一般来说:

在尝试编写可移植代码时,int64_t的格式说明符可能在不同平台上有所不同。对于多种类型,int64_t可能是typedef,包括intlonglong long

为了解决这个问题,我们创建了包含正确格式说明符的宏。在最新版本的C和C ++标准中,您可以使用inttypes.h来获取这些宏。但对于早期的系统,人们需要手工完成这项工作。

所以INT64_FMT可能被定义为:

#define INT64_FMT "lld"

这将使函数调用(在预处理之后):

 return sscanf(content, "Size=%" "lld" "-%" "lld", first, second);

我们也可以将相邻的字符串文字合并为一个字符串文字:

 return sscanf(content, "Size=%lld-%lld", first, second);

关于您的代码:

让我们做一些假设:

  1. content指向空终止字符串。
  2. first指向int64_t
  3. second指向int64_t
  4. INT64_FMT是一个与SCNi64 inttypes.h具有相同价值的宏。
  5. 然后就没有缓冲区溢出。

    因此,如果输入类似于"Size=4-3",那么我们会将4存储在first中,3存储在second中。

    最后:

    通常,写入超过数组末尾会发生缓冲区溢出。你实际上并没有在这里写任何数组,所以不应该发生缓冲区溢出。

    如果不保留假设,肯定会发生其他错误(分段错误,堆栈溢出)。