首页 > 解决方案 > 如何理解 snprintf 处理 NULL 参数?

问题描述

检查以下简单C程序:

#include <stdio.h>

int main(void)
{
    char str[4] = {1, 1, 1, 1};
    snprintf(str, sizeof(str), "%s%s", "a", NULL);

    printf("%s\n", str);
    return 0;
}

构建并运行它Linux

$ gcc test.c
$ ./a.out
a(n

如何理解输出(n中后面a的“”字符?我希望snprintf遇到NULL争论时,它将停止处理。顺便说一句,我无法从snprintf 手册中找到相关信息。

标签: c

解决方案


如果snprintf(fprintfprintf该系列的任何函数) 遇到%s格式说明符的空指针参数,则行为未定义。在现实生活中,许多标准库实现宁愿将(null)序列插入接收缓冲区,而不是崩溃或表现得不可预测。这就是您在实验中观察到的 - 开始成功地适合该收件人数组的剩余(null)空间。snprintfstr


很久以前有一个故事(连不忘初心的互联网似乎都忘记了),美国一家大型电信公司的普通客户,注册了“null”作为自己的email ID,从而得到了“null@” company.com”作为他的电子邮件地址。突然间,他开始收到大量公司内部包含其他客户个人数据的电子邮件。如果我没记错的话,这是由公司内部软件中的一个错误引起的,其中一个空指针被传递给了一个负责形成目标电子邮件地址的函数。该函数并没有崩溃,而是采取了类似的故障安全行为来响应空指针参数。直到有人真正将“null@company.com”注册为有效的电子邮件地址,该错误才被注意到。


推荐阅读