sscanf上可能发生溢出
Possible overflow on sscanf
我和我的朋友最近讨论了以下内容是否可能引发缓冲区溢出。
我熟悉常见的'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
,包括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
是一个宏,与inttypes.h
中的SCNi64
具有相同的值。
则不会出现缓冲区溢出
因此,如果输入是类似"Size=4-3"
的东西,那么我们将4
存储在first
中,3
存储在second
中。
最后:
通常,缓冲区溢出发生在写入超过数组末尾的地方。这里实际上并没有写入任何数组,因此不应该发生缓冲区溢出。
如果假设不成立,肯定会发生其他错误(分段错误、堆栈溢出)。
相关文章:
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- MSVC C6029 警告:缓冲区可能溢出,使用未经检查的值.检查缓冲区大小时,警告不会消失
- 虚拟功能是否不太可能导致堆栈溢出
- 模块名称是否驻留在单独的"name space"中,或者它们可能与例如变量名称发生冲突?
- 当一个类在构造函数处动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc
- C 堆栈溢出异常,可能是由于递归引起的
- 堆缓冲区溢出随机发生。对于一个简单的代码?(我是C++新手)
- 在多线程中是否可能发生读取对象的一半大小?
- C++读取文件时可能发生内存泄漏
- 当i++导致整数溢出时会发生什么
- 缓冲区溢出时会发生什么
- 变量定义期间是否有可能发生异常
- while(true)可能发生的最坏情况是什么?
- C++:为什么我会出现此分段错误(可能发生在 main 之前?
- 缓冲区溢出是否发生在C++字符串中
- 如果STDOUT缓冲区溢出会发生什么
- 指针下溢或溢出时会发生什么情况
- sscanf上可能发生溢出
- 堆栈分配的数组是否可能发生内存泄漏
- 将非常量引用绑定到临时对象 - 可能发生这种情况的示例