这是声明: fprintf(stderr, "Some random string\n").
即使语句不接受任何用户输入,也可以不使用格式说明符(例如 %s)吗?它仍然具有潜在的可利用性吗?似乎至少仍应将包含格式说明符的最佳实践视为最佳做法。我希望能对此事有所澄清。谢谢。
这是声明: fprintf(stderr, "Some random string\n").
即使语句不接受任何用户输入,也可以不使用格式说明符(例如 %s)吗?它仍然具有潜在的可利用性吗?似乎至少仍应将包含格式说明符的最佳实践视为最佳做法。我希望能对此事有所澄清。谢谢。
正如您所展示的,该声明不受任何事物的影响。然而,fprintf()它本身确实是一个解释器:它作为格式字符串所接受的不仅仅是一个字符序列;它是特定语言的源代码,其指令以“%”符号开头。
当你fprintf()这样使用你的函数时,迟早会有一些开发者变得通用、正义和狂热的国际化,并坚持以这种方式重写它:
/* in some .h file */
#define MSG_EN_42 "Some random string\n"
#if LANGUAGE_IS_ENGLISH
#define MSG_42 MSG_EN_42
#endif
/* in another .c file */
fprintf(stderr, MSG_42);
然后,几周/几个月/几年后,另一位对 C 语言了解甚少但对德语/泰语/克林贡语有丰富了解的开发人员将 .h 更改为如下所示:
/* in some .h file */
#define MSG_EN_42 "Some random string\n"
#define MSG_KG_42 "fs'k5 f%n59 #$dsai!\n"
#if LANGUAGE_IS_ENGLISH
#define MSG_42 MSG_EN_42
#endif
#if LANGUAGE_IS_KLINGON
#define MSG_42 MSG_KG_42
#endif
然后麻烦就来了。
(顺便说一句,这不是一个实际的克林贡例子;在毫无戒心的读者身上使用真正的克林贡词会有点粗鲁。但你明白了。)
要避免这些问题,请在格式字符串到期时使用格式字符串。这将导致:
fprintf(stderr, "%s", "Some random string\n");
或者,作为一个更简单的解决方案:
fputs("Some random string\n", stderr);