Повреждение стека в XCode 3.2.6 после вызова функции - PullRequest
1 голос
/ 05 августа 2011

У меня очень странная проблема с очень простым «демонстрационным» приложением. По сути, проблема в том, что если я сделаю вызов метода класса с одним аргументом, и этот метод сразу же вернется, но у него будут переменные, определенные после возврата (см. Ниже), то стек вызовов будет поврежден, а некоторые другие переменные изменены ... Я знаю, что это звучит безумно, но вот код ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    // Override point for customization after application launch.

    [self.window makeKeyAndVisible];

    NSError *er=[MLRESTRequest test:nil];  //<- this line modifies the "application" variable passed as first argument!

    return YES;
}


@implementation MLRESTRequest
+ (NSError*) test:(id)task
{
    return nil;

    NSURLResponse *responseHeaders=nil;
    NSDictionary *responseHeadersDict=nil;
    NSError *error=nil;
    NSData *result=nil;
    NSURL *urlToCall = nil;
    NSMutableURLRequest *urlRequest=nil;    
    NSString *serverRequest=nil;
    NSString *cookie=nil;

    NSString *server=nil;
    NSString *port=nil;
    NSString *call=nil;
    //return nil;
}
@end

Если я переместу возврат в конце метода «test», тогда все в порядке ...

Редактировать: я публикую изображения проблемы в комментариях

Edit2: я заново создал образ Mac и установил свежую копию xCode 3.2.6 - проблема исчезла. К сожалению, через несколько дней у меня начались подобные проблемы ... (переменная стека изменяется безо всякой причины после возврата из вызова функции) ... Я перекомпилировал точно такой же код на 3.2.5 и 4.0, и проблема снова исчезла ... Я не знаю, что делать, но пока буду держаться подальше от 3.2.6

.

Edit3: Если кто-то все еще интересуется этим случаем - у меня есть доказательства того, что GCC 4.2, используемый в 3.2.6, глючит - если используется LLVM + GCC 4.2, то не происходит сбой

Ответы [ 3 ]

2 голосов
/ 05 августа 2011

Вы отлаживаете это в режиме выпуска?Или режим отладки?Если вы находитесь в режиме выпуска, вы не можете доверять чему-либо, о чем вам говорит отладчик.

1 голос
/ 05 августа 2011

Единственный способ изменить application в этом коде, как он был опубликован, - это если вы компилируете с включенной оптимизацией.Конец истории.

Реализация test:, независимо от того, где находится оператор return, практически ничего не делает и, безусловно, не повлияет на фрейм родительского стека.

Как Джошуасказал, что вы не дали достаточно информации, чтобы рассказать вам, что происходит.Опубликуйте обратный след аварии, для начала.

0 голосов
/ 05 августа 2011

Исходя из вашего комментария к Джошуа Вайнбергу, похоже, что вы пытаетесь получить доступ к переменным, которые были оптимизированы, т.е. к переменным, которые объявлены ниже возврата.Не делай этого!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...