Предупреждение: “формат не строковый литерал и никакие аргументы формата”

Java всегда является передачей значением, без исключений, когда-либо .

Поэтому как получается, что кто-либо может быть вообще смущен этим и полагать, что Java является передачей ссылкой, или думают, что у них есть пример Java, действующего как передача ссылкой? Ключевой пункт - то, что Java никогда не обеспечивает прямой доступ к значениям сами объекты , в никакой обстоятельства. Единственный доступ к объектам через ссылка к тому объекту. Поскольку объекты Java всегда , получил доступ через ссылку, а не непосредственно, распространено говорить о полях и переменных и аргументы метода как являющийся объекты , когда педантично они - [только 1 110] ссылки на объекты . беспорядок останавливает от этого (строго говоря, неправильный) изменение в номенклатуре.

Так, при вызове метода

  • Для примитивных аргументов (int, long, и т.д.), передача значением фактическое значение из примитива (например, 3).
  • Для объектов, передача значением является значением [1 112] ссылка на объект .

Поэтому, если Вы имеете doSomething(foo) и public void doSomething(Foo foo) { .. }, два Foos скопировали ссылки что точка к тем же объектам.

Естественно, передающий значением ссылка на объект смотрит очень как (и неотличимо на практике от), передача объекта ссылкой.

109
задан Josh Caswell 5 October 2011 в 06:47
поделиться

8 ответов

Правильно ли вы размещаете скобки? Я не думаю, что NSLog () любит принимать только один аргумент, а именно то, что вы ему передаете. Кроме того, он уже выполняет форматирование за вас. Почему бы просто не сделать это?

NSLog(@"%@ %@, %@", 
   errorMsgFormat, 
   error, 
   [error userInfo]);              

Или, если вы говорите, что errorMsgFormat - это строка формата с одним заполнителем, вы пытаетесь это сделать?

NSLog(@"%@, %@", [NSString stringWithFormat:errorMsgFormat, error], 
   [error userInfo]);              
112
ответ дан 24 November 2019 в 03:17
поделиться

Xcode is complaining because this is a security problem.

Here's code similar to yours:

NSString *nameFormat = @"%@ %@";
NSString *firstName = @"Jon";
NSString *lastName = @"Hess %@";
NSString *name = [NSString stringWithFormat:nameFormat, firstName, lastName];
NSLog(name);

That last NSLog statement is going to be executing the equivalent of this:

NSLog(@"Jon Hess %@");

That's going to cause NSLog to look for one more string argument, but there isn't one. Because of the way the C language works, it's going to pick up some random garbage pointer from the stack and try to treat it like an NSString. This will most likely crash your program. Now your strings probably don't have %@'s in them, but some day they might. You should always use a format string with data you explicitly control as the first argument to functions that take format strings (printf, scanf, NSLog, -[NSString stringWithFormat:], ...).

As Otto points out, you should probably just do something like:

NSLog(errorMsgFormat, error, [error userInfo]);
157
ответ дан 24 November 2019 в 03:17
поделиться

Самый быстрый способ исправить это - добавить @ "% @ ", в качестве первого аргумента вашего вызова NSLog , то есть

NSLog(@"%@", [NSString stringWithFormat: ....]);

Хотя вам, вероятно, следует рассмотреть ответ Шестнадцати Отто.

10
ответ дан 24 November 2019 в 03:17
поделиться

NSLog () ожидает форматную строку, а передается просто строка. Вам не нужно использовать stringWithFormat :, вы можете просто сделать:

NSLog (@ "% @% @,% @", errorMsgFormat, error, [error userInfo])

И тогда предупреждение исчезнет .

2
ответ дан 24 November 2019 в 03:17
поделиться

Если вы хотите избавиться от предупреждения "формат не строковый литерал и отсутствие аргументов формата «раз и навсегда, вы можете отключить параметр предупреждения GCC« Typecheck Calls to printf / scanf »(GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = NO) в настройках вашей целевой сборки.

3
ответ дан 24 November 2019 в 03:17
поделиться

Я просто передавал nil, чтобы свести на нет предупреждения, может это сработает для вас?

NSLog(myString, nil);

10
ответ дан 24 November 2019 в 03:17
поделиться

FWIW, это также относится и к разработчикам iPhone. Я кодирую SDK 3.1.3 и получил ту же ошибку с той же проблемой (вложение stringWithFormat внутри NSLog ()). Сикстен и Джон в деньгах.

2
ответ дан 24 November 2019 в 03:17
поделиться

Окончательный ответ: как сказал Джон Хесс, это проблема безопасности, потому что вы передаете WHATEVER в функцию, ожидающую строку формата. То есть он будет оценивать все спецификаторы формата ВНУТРИ строки any. Если их нет - круто, но если есть, могут случиться плохие вещи.

Таким образом, правильнее всего будет ИСПОЛЬЗОВАТЬ строку формата напрямую, например

NSLog(@"%@", myNSString);

Таким образом, даже если в myNSString есть спецификаторы формата, они не будут оцениваться NSLog.

38
ответ дан 24 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: