c - 如何理解 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
手册中找到相关信息。
解决方案
如果snprintf
(fprintf
或printf
该系列的任何函数) 遇到%s
格式说明符的空指针参数,则行为未定义。在现实生活中,许多标准库实现宁愿将(null)
序列插入接收缓冲区,而不是崩溃或表现得不可预测。这就是您在实验中观察到的 - 开始成功地适合该收件人数组的剩余(null)
空间。snprintf
str
很久以前有一个故事(连不忘初心的互联网似乎都忘记了),美国一家大型电信公司的普通客户,注册了“null”作为自己的email ID,从而得到了“null@” company.com”作为他的电子邮件地址。突然间,他开始收到大量公司内部包含其他客户个人数据的电子邮件。如果我没记错的话,这是由公司内部软件中的一个错误引起的,其中一个空指针被传递给了一个负责形成目标电子邮件地址的函数。该函数并没有崩溃,而是采取了类似的故障安全行为来响应空指针参数。直到有人真正将“null@company.com”注册为有效的电子邮件地址,该错误才被注意到。
推荐阅读
- javascript - 在水平滚动页面上的某个点停止
- r - Gsub 在第一个空格之前识别字符串,只有数字
- regex - Powershell 正则表达式未按预期工作
- python - 在特定 XML 标记上方添加一行,在结束 XML 标记下方添加一行
- java - setBackgroundColor() 是否调用 onDraw()?
- powershell - 远程连接问题 - 访问被拒绝
- javascript - SSO 与 Angular6 应用程序的集成
- vb.net - Crystal Reports - 删除 2 个数据字段中的重复项
- phantomjs - 对我如何执行 PhantomJS 文件感到困惑。初学者需要建议。[苹果系统]
- android - Android Recycler - 到处点击时调用 OnClickListener