2

假设我们在 C 中工作。

如果我继续这样做:

char *word;
word = "Hello friends";
printf(word);

然后 XCode 告诉我,因为我没有使用字符串文字,所以我可能有一些可能不安全的东西。这是否意味着有机会破解我的程序?如果是这样,那怎么会发生?

或者,如果我这样做:

char *word;
word = "Hello friends";
printf("%s", word);

然后 XCode 没有引发任何标志,我很好。究竟有什么区别?

4

2 回答 2

4

第一个参数printf不是您要打印的字符串。这是一个格式字符串。它可以包含格式化指令,一旦与其他参数组合,就会产生打印的字符串。

您的第一个示例是不受控制的格式字符串漏洞

于 2013-03-08T14:26:40.580 回答
2

问题是,在第一种情况下,如果word包含格式规范(%d%f%s等),那么printf()将假定这些值在堆栈上,但实际上它们不在,这可能导致崩溃。

如果您不关心格式,请使用puts()or代替。fputs()

于 2013-03-08T14:22:08.507 回答