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

时间:2013-02-04 16:55:02

标签: objective-c compiler-warnings

  

可能重复:
  Why is my string potentially unsecure in my iOS application?

自将XCode升级到4.6以来的新编译器警告:

Format string is not a string literal (potentially insecure)

最后一行展示警告的最小例子:

  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: - 这里我想要一个动态断言描述,每次迭代都会改变,但不是每次检查。

我可以将格式字符串和数据传递给Asserts,但是我必须单独维护这些描述。

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

1 个答案:

答案 0 :(得分:4)

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

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

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