2011-08-05 5 views
1

매우 간단한 "데모"응용 프로그램과 관련하여 매우 이상한 문제가 있습니다. 근본적으로 문제는 클래스 메서드를 단일 인수로 호출하면이 메서드는 즉시 반환되지만 반환 값 (아래 참조)이 정의 된 다음 호출 스택이 손상되고 일부 다른 변수가 변경된다는 것입니다. 나는 "테스트"방법의 끝에 반환을 이동하면Xcode 3.2.6 함수 호출 후 스택 손상

- (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 

모든 확인입니다 ...이 미친 소리 그러나 여기 코드입니다 ...

편집 : 나는 이미지를 게시 의견의 문제

Edit2 : Mac을 다시 이미지하고 xCode 3.2.6의 새로운 복사본을 설치했습니다. 문제가 사라졌습니다. 슬프게도 며칠 후 비슷한 문제가 생기기 시작했다. (스택 변수는 함수 호출에서 돌아온 후에 아무런 이유없이 변경된다.) 3.2.5와 4.0에서 똑같은 코드를 다시 컴파일했고 그 문제는 다시 사라졌다. . 나는 무엇을해야할지 모르지만 현재는 멀리 떨어져있을 것이다. 3.2.6

편집 3 :이 사례에 대해 아직도 관심이있는 사람이 있다면 - 나는 3.2.6에서 사용 된 GCC 4.2가 버그가 있음을 입증했다. LLVM + GCC 4.2가 사용 된 경우 크래시가 발생하지 않습니다.

+0

'return' 문 뒤에있는 코드의 목적은 무엇입니까? 도달 했습니까? – Codo

+0

목적이 없음 -이 코드는 "데모"만을위한 것입니다. - 저는 많은 복잡한 프로젝트에 문제가 있으며이 문제에 대한 이슈를 좁히고 있습니다. 반환 후에 정의 된 변수가 있습니다 ... 내가 vars를 제거하거나 그 뒤에 리턴을 이동하면 - OK ... – Sunman

+0

어떤 버전의 XCode와 어떤 컴파일러를 사용하고 있습니까? 최근에 나는 잘못된 코드를 생성하는 컴파일러까지 추적 할 수있는 몇 가지 문제를 보았습니다.하지만 지금까지 릴리스 모드에만 영향을 미쳤습니다. – Codo

답변

2

릴리스 모드에서 디버깅 하시겠습니까? 아니면 디버그 모드? 릴리스 모드에 있다면 디버거가 이런 종류의 것에 대해 알려주는 것을 정말로 신뢰할 수 없습니다.

+0

디버그 모드에서 - "손상된"응용 프로그램 변수에 액세스하려고하면 "정상"EXC_BAD_ACCESS가 생성됩니다 ... – Sunman

+0

당신이 우리에게 말하지 않은 것이 있거나 현재 일어나고있는 것을 오독하고 있습니다. –

1

application은 최적화 된 상태에서 컴파일하는 경우에만 해당 코드에서 수정 될 것입니다. 이야기의 끝.

return 문이 어디에 있든 관계없이 test:의 구현은 거의 아무것도 수행하지 않으며 확실히 부모 스택 프레임에 영향을주지 않습니다.

조슈아가 말했듯이, 당신은 무슨 일이 일어나고 있는지 알려주는 충분한 정보를주지 못했습니다. 우선 충돌에 대한 백 트레이스를 게시하십시오.

0

Joshua Weinberg에 대한 귀하의 의견을 토대로 최적화 된 변수, 즉 아래에 선언 된 변수 인이 반환 된 변수에 액세스하려는 것 같습니다. 그렇게하지 마!

관련 문제