在格式化控制符中,有一种鲜为人知的控制符%n。这个控制符用于把当前输出的所有数据的长度写回一个变量中去,下面这段代码展示了这种用法。
#include<stdio.h>
int main(int argc, char const *argv[])
{
int length=0;
printf("hello%n\n",&length);
printf("%d\n",length);
return 0;
}
//编译环境:gcc
//测试环境:Linux mint
//
//输出:
//hello
//5
但是这个控制符很早以前就被Windows弃用了,VS2005 中在编译级别对参数做了更好的检查,而且默认情况下关闭了对“%n”控制符的使用,所以运行是会出现“Unhandled exception at 0x........ (ucrtbased.dll) in test.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.”,但是在vc6.0++和Linux上依然可以使用。
那么为什么要弃用控制符%n呢?
原因是%n可能会造成溢出漏洞,从而使进程被恶意代码劫持。