【发布时间】:2020-11-18 22:20:06
【问题描述】:
我有以下一段代码,一位同事声称其中可能包含越界读取,我不同意。你能帮忙解决这个争论并解释原因吗?
char *test_filename = malloc(Size + 1);
sprintf(test_filename, "");
if (Size > 0 && Data)
snprintf(test_filename, Size + 1, "%s", Data);
其中Data 是const uint8_t *Data 类型的非空终止字符串,Size 是Data 的大小,即Data 中size_t 类型的字节数。
可能因为格式字符串为%s而读取越界?
【问题讨论】:
-
如果未终止的源字符串的长度为 4,而您传递了 5,
snprintf怎么知道在 4 处停止? -
if (Size > 0 && !Data)-->> snprintf 仅在 Size 大于零且 Data IS NULL 时执行。 -
一位同事声称可能包含越界读取而且您无能为力,因为您正在进行字符串处理假设字符串正确终止。问题在于在将非 NUL 终止字符串传递给您的函数的任何代码中。
-
@Peter-ReinstateMonica 你误解了我的评论。 当然 如果“字符串参数不是
NUL-终止”,snprintf()将读取多余的字节。但是 问题 是由传入一个不正确终止的字符串引起的。请注意,未正确终止的参数是不是字符串。一个字符串——根据定义——必须有一个正确的'\0'终止符。如果调用代码不能确保这一点,则问题出在 调用 代码中。 “这是我处理字符串的函数。” “好的,这是不是字符串的东西!” -
不仅如此,如果示例中的
Data是标准的[unsigned] char *用于引用字符串,那么如果没有正确终止,函数就无法判断它应该在哪里结束.再次 - 问题出在调用代码中。