我和我的朋友最近就以下是否可能触发缓冲区溢出进行了辩论。
我熟悉我遇到的常见'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);
}
答案 0 :(得分:6)
在尝试编写可移植代码时,int64_t
的格式说明符可能在不同平台上有所不同。对于多种类型,int64_t可能是typedef
,包括int
,long
或long 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);
让我们做一些假设:
content
指向空终止字符串。first
指向int64_t
。second
指向int64_t
。INT64_FMT
是一个与SCNi64
inttypes.h
具有相同价值的宏。然后就没有缓冲区溢出。
因此,如果输入类似于"Size=4-3"
,那么我们会将4
存储在first
中,3
存储在second
中。
通常,写入超过数组末尾会发生缓冲区溢出。你实际上并没有在这里写任何数组,所以不应该发生缓冲区溢出。
如果不保留假设,肯定会发生其他错误(分段错误,堆栈溢出)。