매우 간단한 "데모"응용 프로그램과 관련하여 매우 이상한 문제가 있습니다. 근본적으로 문제는 클래스 메서드를 단일 인수로 호출하면이 메서드는 즉시 반환되지만 반환 값 (아래 참조)이 정의 된 다음 호출 스택이 손상되고 일부 다른 변수가 변경된다는 것입니다. 나는 "테스트"방법의 끝에 반환을 이동하면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가 사용 된 경우 크래시가 발생하지 않습니다.
'return' 문 뒤에있는 코드의 목적은 무엇입니까? 도달 했습니까? – Codo
목적이 없음 -이 코드는 "데모"만을위한 것입니다. - 저는 많은 복잡한 프로젝트에 문제가 있으며이 문제에 대한 이슈를 좁히고 있습니다. 반환 후에 정의 된 변수가 있습니다 ... 내가 vars를 제거하거나 그 뒤에 리턴을 이동하면 - OK ... – Sunman
어떤 버전의 XCode와 어떤 컴파일러를 사용하고 있습니까? 최근에 나는 잘못된 코드를 생성하는 컴파일러까지 추적 할 수있는 몇 가지 문제를 보았습니다.하지만 지금까지 릴리스 모드에만 영향을 미쳤습니다. – Codo