Проблема со спецификаторами формата строки NSString

#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 или отсутствие каких-либо аргументов, но это немного спорное упражнение. Если вы используете его таким образом, вы сразу же столкнетесь с проблемами. Так что я имею в виду немного того и другого, поскольку вы используете недопустимые спецификаторы формата, вы получите неопределенное поведение, и все возможно.