诡异的输出:printf(const char* format [, argument]… );

作者:半瓶墨水   链接:http://www.2maomao.com/blog/printf-wierd-why/

连着两天遇到这个问题,记一下。

这是一个文本搜索的小工具,为了输出所要的结果,我写了一个很类似printf的函数,也是接受一个format字符串,一个变参,内部处理了一下(遇到中文就输出其unicode码),然后调用vprintf。

一开始都好好的,当我开始搜用DJango写的代码的时候,输出的结果里面总是有一些灵异的数字。

呵呵其实原因很简单,试试这个输出就知道了:
printf(“{% if not logged_in %}”);

DJango模板中经常有”{% if”这种字符串出现,而”%i”又是printf的格式串,结果就输出了一个神秘的数字。

修正的方法很简单,改成类似于这样的调用就行了:
printf(“%s”, “{% if not logged_in %}”);

避免这类问题发生的方法是:
输出可疑字符串(比如从文件中读出来的字符串)的时候一直使用printf(“%s”, str)这种格式。

一条评论 发表在“诡异的输出:printf(const char* format [, argument]… );”上

  1. Googol说道:

    恩,printf(str)是C里一个很常见的错误,而且如果str是用户输入的内容,那这还是一种不安全的代码。黑客可以伪装用户输入%d之类的来获得一些参数压栈的信息。

    而且,更进一步,可以通过控制str的内容,来改写栈内容。printf有一个控制字%n,是把当前输出的字符串长度写入到对应的变量里。与压栈信息结合,可以实现向任意内存写入任意数值的目的。

留下回复