sscanf上可能发生溢出

Possible overflow on sscanf

本文关键字:溢出 可能发生 sscanf      更新时间:2023-10-16

我和我的朋友最近讨论了以下内容是否可能引发缓冲区溢出。

我熟悉常见的'sscanf'函数,我遇到过。但是这个对我来说似乎有点奇怪,因为我不太确定在这种情况下如何解释格式说明符'%' INT64_FMT,以及'sscanf'将向'first'写入什么&"第二个"变量。

有人知道吗?

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

一般来说:

在尝试编写可移植代码时,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是一个宏,与inttypes.h中的SCNi64具有相同的值。

则不会出现缓冲区溢出

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

最后:

通常,缓冲区溢出发生在写入超过数组末尾的地方。这里实际上并没有写入任何数组,因此不应该发生缓冲区溢出。

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