如果将负数或0作为第二个参数传递给snprintf()它,它是否会在提供的缓冲区位置写入.想知道这不会导致任何意外行为.
int snprintf(char *str, size_t size, const char *format, ...);
Run Code Online (Sandbox Code Playgroud)
引用C11,chpater§7.21.6.5,该snprintf()功能
int snprintf(char * restrict s, size_t n,const char * restrict format, ...);[...]如果
n为零,则不写入任何内容,并且s可能是空指针.
因此,如果您传递0,则不会写入任何内容.
如果你传递一个-ve值,它可能会产生问题,因为第二个参数的类型size_t是unsigned.因此,签名值将被视为unsigned产生不需要的大小.这可能会导致问题(内存溢出),因为大小可能比提供的缓冲区可以处理的大,这会调用未定义的行为..然而,只要缓冲区足够大以便能够保存所提供的数据,所提供的数据就会被写入缓冲区.
从§7.19, <stddef.h>
size_t
这是sizeof运算符的结果的无符号整数类型;
传递0给snprintf任何字符都不会被插入到dest缓冲区中。
将负数传递给size_t参数,即unsigned,您正在传递一个非常大的数字作为size。
尝试
printf("%zu\n%zu\n", (size_t)(-1), SIZE_MAX);
Run Code Online (Sandbox Code Playgroud)
因此,使用负大小参数,您可以写入比实际目标缓冲区大小更多的字节,换句话说,就是未定义的行为/缓冲区溢出。