You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何fprintf_s的格式字符串不能使用用户自定义字符串?

关于fprintf_s中禁止使用用户自定义format字符串的疑问

根据微软官方文档,fprintf_s函数原型为:

int fprintf_s(
   FILE *stream,
   const char *format [,
   argument_list ]
);

其中format为格式控制字符串,示例用法为:

fprintf_s (stdout, "%s", "Hello" );

文档明确要求「确保format不是用户自定义字符串」,请问是否指禁止如下用法:

char user_defined_str [100] = "%s";
fprintf_s (stdout, user_defined_str, "Hello");

若确实禁止,该用法存在什么问题?已知该用法需避免,但不理解背后原因。


结论

是的,微软文档的要求明确禁止这种将用户自定义字符串作为format参数传入fprintf_s的用法。

风险原因

  • 未定义行为风险:如果用户自定义的格式字符串与后续参数不匹配(比如格式符类型不符、数量不一致),会直接触发未定义行为——可能导致程序崩溃、内存数据泄露,甚至被恶意利用执行非法代码。哪怕你当前写的"%s"看似安全,只要这个字符串来自外部输入(用户输入、配置文件等),就完全不可控。
  • 违背安全函数设计初衷:fprintf_s作为C标准库的安全增强函数,核心就是修复传统fprintf的格式字符串漏洞。允许用户自定义格式字符串,等于重新引入了原本要规避的风险,失去了使用fprintf_s的意义。
  • 静态检查失效:编译器会对字面量格式字符串做静态检查,比如提示格式符与参数不匹配的问题。但变量形式的格式字符串无法触发这类检查,潜在错误很难被提前发现。

内容的提问来源于stack exchange,提问作者Squared

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:07:11