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

gav*_*gav 6 objective-c compiler-warnings

可能重复:
为什么我的字符串在我的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);
  }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nik*_*uhe 4

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

STAssertNotNil(res, @"%@", desc);
STAssertNotEquals(@"", res, @"%@", desc);
Run Code Online (Sandbox Code Playgroud)

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