可能重复:
SnowLeopard Xcode warning: “format not a string literal and no format arguments”
我在这行代码中遇到以下问题。
“格式字符串不是字符串文字(可能不安全)”
NSLog([NSString stringWithFormat:@"%@", entered]);
有什么建议吗?
答案 0 :(得分:138)
编译器希望我们对格式字符串(NSLog
的第一个参数)使用NSString常量,因为它可以防止可能违反安全性的相当知名的漏洞。因此,例如,您可以按如下方式更改发布的代码,以使编译器满意:
NSLog(@"%@", [NSString stringWithFormat:@"%@", entered]);
修改强>
当然,上述内容可以(而且应该)简单地写成如下:
NSLog(@"%@", entered);
安全漏洞的性质
不受控制的格式字符串 [1]是一种软件漏洞, 在1999年左右发现,可用于安全漏洞。 以前认为无害的格式字符串漏洞可用于 崩溃程序或执行有害代码。问题源于 使用未经检查的用户输入作为格式字符串参数 执行格式化的C函数,例如
printf()
。恶意的 用户可以使用%s
和%x
格式标记来打印数据 从堆栈或可能在内存中的其他位置。也可以 使用%n
格式令牌将任意数据写入任意位置, 其中命令printf()
和类似函数写入的数量 格式化为存储在堆栈中的地址的字节。典型的漏洞利用 使用这些技术的组合来强制程序覆盖 库函数的地址或堆栈上的返回地址 用指针指向某些恶意shellcode。填充参数为 格式说明符用于控制输出的字节数和
%x
令牌用于从堆栈中弹出字节直到开头 到达格式字符串本身。格式字符串的开头 精心设计,以包含%n
格式令牌可以的地址 用要执行的恶意代码的地址覆盖。
来源:维基百科Uncontrolled Format String
[1]:http://cwe.mitre.org/data/definitions/134.html“CWE-134:不受控制的格式字符串”。常见的弱点列举。迈特。
答案 1 :(得分:31)
这是解决方案。
Warning: "format not a string literal and no format arguments"
尝试
NSLog(@"%@",entered);
因为NSLog也可以为你做格式化...
答案 2 :(得分:2)
<强>尝试:强>
NSLog(@"%@",[NSString stringWithFormat:@"%@",entered]);
希望这会对你有所帮助。 :)