我有以下一段代码,我的同事声称其中可能包含越界读取,而我不同意。你能帮忙解决这个争论并解释原因吗?
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
,也许是这个原因吗?
snprintf
如何知道在4处停止? - Weather VaneNUL
结尾”,snprintf()
会读取多余的字节。但是问题是由于传递了一个未正确终止的字符串而引起的。请注意,未正确终止的参数不是字符串。按照定义,字符串必须具有适当的'\0'
终止符。如果调用代码没有确保这一点,则问题在于调用代码。 “这是我处理字符串的函数。” “好的,这里有一些不是字符串!” - Andrew HenleData
是用于引用字符串的标准[unsigned] char *
,那么如果它没有被正确终止,函数就无法确定它应该在哪里结束。再次强调 - 问题出现在调用代码中。 - Andrew Henle