snprintf(),溢出的可能性?

时间:2018-03-07 03:07:34

标签: c printf

我有固定大小的数组 - arr1和arr2。

char arr1[100];
char arr2[100];
snprintf(arr2, sizeof(arr2), "%sAND", "CONTENTOFARRAY2");
snprintf(arr1, sizeof(arr1), "%sAND", arr2);

第二个snprintf会导致缓冲区溢出吗?我已经尝试了一些测试,到目前为止没有发现任何问题。

有没有人注意到这些问题?

1 个答案:

答案 0 :(得分:4)

在第二个电话中,"%s"并未指示snprintf()使用arr2[100]全部 - 请参阅comment,只是构成字符串的第一部分 - 希望并不过分。

如果arr2[]填充了更长的字符串 - 例如98个字符,arr1[]将收到截断版本的连接。仍然没有缓冲区溢出。

由于snprintf()旨在防范溢出,因此不需要检查溢出。相反,谨慎使用snprintf()会检查截断的结果。

  

snprintf函数返回在n足够大的情况下写入的字符数,不计算终止空字符,如果发生编码错误则返回负值。 C11dr§7.21.6.33

int count = snprintf(arr1, sizeof arr1, "%sAND", arr2);
if (count < 0 || count >= sizeof arr1) Handle_Error();