1

我在 Xcode 5 中添加 sparkle 框架时遇到问题。这篇文章基本上描述了它。问题是 sparkle 没有复制到 frameworks 文件夹中。解决方案是下载源代码,更改一些设置并自己构建。但是:在构建过程中出现错误:

NSAlert *alert = [NSAlert alertWithMessageText:SULocalizedString(@"Update Error!", nil) defaultButton:SULocalizedString(@"Cancel Update", nil) alternateButton:nil otherButton:nil informativeTextWithFormat:[error localizedDescription]];

生产

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

我不知道如何解决这个问题。任何人都可以帮忙吗?

4

1 回答 1

4

我今天遇到了同样的问题。更改非常简单。

改变:

NSAlert *alert = [NSAlert alertWithMessageText:SULocalizedString(@"Update Error!", nil)
                                 defaultButton:SULocalizedString(@"Cancel Update", nil)
                               alternateButton:nil
                                   otherButton:nil
                     informativeTextWithFormat:[error localizedDescription]];

至:

NSAlert *alert = [NSAlert alertWithMessageText:SULocalizedString(@"Update Error!", nil)
                                 defaultButton:SULocalizedString(@"Cancel Update", nil)
                               alternateButton:nil
                                   otherButton:nil
                     informativeTextWithFormat:@"%@", [error localizedDescription]];

如果您感兴趣,解释informativeTextWithFormat是实际上是变量参数列表的开始,其中第一个参数是格式字符串,随后的参数是该格式的输入。错误是因为格式来自运行时字符串(而不是编译时常量字符串),因此无法在编译时验证它 - 恶意用户可以(以某种方式)在运行时更改格式字符串,以从此应用程序中执行恶意代码。

它与以下之间的区别相同:

NSLog([error localizatedDescription]);

和:

NSLog( @"%@", [error localizatedDescription]);

希望这可以帮助。

于 2013-12-18T01:35:24.317 回答