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:ます。ここでは、チェックごとではなく反復ごとに変化する動的アサート記述が必要です。

書式文字列とデータを Assert に渡すことはできますが、説明を個別に維持する必要があります。

ログメッセージまたはアサートコールで使用する前に説明のフォーマットが必要な場合、この警告を回避するにはどうすればよいですか?

4

1 に答える 1

4

問題は、アサーション内の非リテラル形式の文字列です。それらを次のように変更します。

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

フォーマット文字列は一般的なセキュリティの問題です。それらがコンパイラに表示されない場合、コンパイラはそれらをチェックできません。あなたの場合、それらはに隠されていdescます。

于 2013-02-04T17:35:45.850 に答える