警告:格式字符串不是字符串文字(可能不安全)

Eva*_*van 34 objective-c

我在NSLog行中收到警告

Format string is not a string literal(potentially insecure)
Run Code Online (Sandbox Code Playgroud)

从以下代码

NSMutableString  *MarqueeMessage = [[NSMutableString alloc]init];
[MarqueeMessage appendString:@"Abc"];
NSString *immutableString = MarqueeMessage;
NSLog(immutableString);
Run Code Online (Sandbox Code Playgroud)

我可以问为什么在将这行改为以下代码后,警告消失了?

NSLog(immutableString,nil);
Run Code Online (Sandbox Code Playgroud)

use*_*109 71

这只是编译器的说法,"嘿,你真的知道你在做什么吗?" 编译器担心输入字符串可能包含百分号字符%,并且您没有指定相应的参数.显然,基于您提供的代码并非如此,但编译器并不够聪明,无法解决这个问题.

通过添加一个参数(可以包括数字,字符串或零),你可以说服编译器你知道你在做什么.使编译器满意的另一种方法是输出带有这样代码的字符串.

NSLog( @"%@", immutableString );
Run Code Online (Sandbox Code Playgroud)

此方法的优点是字符串中的意外格式说明符(例如%s)不会导致任何问题.

  • 但这并没有回答**潜在的不安全**方面,为此你可以参考[这个答案](http://stackoverflow.com/a/5428346/468724) (14认同)