#c #objective-c #printf #nsstring
#c #objective-c #printf #nsstring
Вопрос:
Интересно, в чем проблема для этих спецификаторов формата, которые будут аварийно завершаться при вызове с initWithFormat:arguments
помощью .
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// success cases
[self log:@"%p"];
[self log:@"% P"];
[self log:@"% P% o"];
[self log:@"% P% o %"];
// crash cases
[self log:@"%P%o%P"];
[self log:@"% P% o % P"];
return YES;
}
- (void)log:(NSString *)format, ... {
va_list args;
va_start(args, format);
NSString *logLine = [[NSString alloc] initWithFormat:format arguments:args];
va_end(args);
NSLog(@"%@", logLine);
}
Комментарии:
1. Вам, конечно, нужно указать аргументы — это выведет тарабарщину, поскольку аргументов нет, и будет считываться из некоторого случайного места, что может вызвать всевозможные проблемы и может быть причиной сбоя. Тогда (верхний регистр)
P
не является допустимым спецификатором формата, поэтому опять может случиться все, что угодно.2. @skaak итак, здесь вы имеете в виду, что это может быть просто неопределенное поведение, при котором все возможно?
3. Я думаю, вы, вероятно, могли бы понять это, если бы обладали глубокими техническими знаниями о том, как
printf
обрабатывается, например, (неизвестный) верхний регистрP
или отсутствие каких-либо аргументов, но это немного спорное упражнение. Если вы используете его таким образом, вы сразу же столкнетесь с проблемами. Так что я имею в виду немного того и другого, поскольку вы используете недопустимые спецификаторы формата, вы получите неопределенное поведение, и все возможно.