6

可能重复:
为什么我的字符串在我的 iOS 应用程序中可能不安全?

将 XCode 升级到 4.6 后的新编译器警告:

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

展示最后两行警告的最小示例:

  for (NSUInteger i = 0; i < 10; i++) {
    NSString *res = [testInstance generate:i];
    NSString *desc = [NSString stringWithFormat:@"TestData: %d", i];
    STAssertNotNil(res, desc);
    STAssertNotEquals(@"", res, desc);
  }

我查看了与此警告有关的其他问题,但它们源于程序员不必要地使用stringWithFormat:- 这里我想要一个动态断言描述,它每次迭代都会改变,但不会每次检查。

我可以将格式字符串和数据传递到断言中,但是我必须独立维护描述。

如果我要求在日志消息或断言调用中使用描述的格式之前,我该如何避免此警告?

4

1 回答 1

4

问题是断言中的非文字格式字符串。将它们更改为:

STAssertNotNil(res, @"%@", desc);
STAssertNotEquals(@"", res, @"%@", desc);

格式字符串是一个常见的安全问题。当它们对编译器不可见时,它无法检查它们。在您的情况下,它们已隐藏在desc.

于 2013-02-04T17:35:45.850 回答