尽管存在明显的缺点,为什么C具有%n格式说明符?

参见英文答案 >
What is the use of the %n format specifier in C?                                    10个

我一直在学习格式字符串漏洞,这是我第一次听说过%n.我不明白为什么它存在.

好的,当然,我可以想象你想知道你到目前为止写过多少个字的情况.但是还有很多其他方法可以找到字符串的长度,而%n似乎是一种奇怪的方法.它与所有其他格式说明符不同,因为它不会写入字符串,而是写入内存中的其他手动指定位置.而且因为它太不直观了 – 谁会期望printf写入任意内存? – 它似乎具有创建安全漏洞的明显潜力.除非有人警告你格式化字符串漏洞,否则你可能永远不会想到它.

一定有这样做的理由.但它是什么?或者上面描述的问题当时不被认为是严重的?

最佳答案 如
This question所示,它实际上并没有将它的值存储在随机存储器中.

Nothing printed. The argument must be a pointer to a signed int, where the number of characters written so far is stored.

#include <stdio.h>

int main()
{
  int val;

  printf("blah %n blah\n", &val);

  printf("val = %d\n", val);

  return 0;

}

如果您想知道何时在控制台上换行,想要对齐您的值以及您希望对输出执行的其他格式化过程,则此参数非常有用.

点赞