2012-11-12 2 views
1

내 손을 잡을 수있는 모든 iOS 장치 및 Xcode에 연결된 에뮬레이터에서 문제없이 응용 프로그램을 테스트했습니다. 이제 애플에서 아이폰 OS 6.0.1을 돌리는 아이 패드 3rd Gen에서 충돌로 앱이 거부되었다는 말을 들었다.충돌로 인해 애플이 거부되었습니다. 재현 할 수 없습니다. sha256

문제는 다음과 같은 기능에서 발생한 것으로 보인다
0 libsystem_c.dylib    0x39421d74 strlen + 28 
1 Appname       0x0000da16 +[Utilities sha256:] (Utilities.m:28) 
2 Appname       0x0000dc1c +[Utilities complete256Hash:]    (Utilities.m:46) 
3 Appname       0x0000ea66 -[SettingController TestSettingsTapped] (SettingController.m:83) 

, 누군가가 내가 충돌 애플을 재현 할 수 아니다 원인, 잘못 될 일 날 지점 수 : 충돌에서

내가 읽을 수있는 기록 모든 테스트를 마친 기기를 덴마크어로 설정해야 할 수도 있습니다.

+(NSString*) sha256:(NSString *)clear{ 
    const char *s=[clear cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *keyData=[NSData dataWithBytes:s length:strlen(s)]; 
    uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0}; 
    CC_SHA256(keyData.bytes, keyData.length, digest); 
    NSData *out=[NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; 
    NSString *hash=[out description]; 
    hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
    hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""]; 
    return hash; 
} 

감사합니다.

답변

0

스 니펫의 세 번째 줄에서 호출중인 strlen() 전화가 불량 포인터를 전달 중입니다. 내가 생각할 수있는 가장 큰 이유는 clear도 0이 아니기 때문에 s이 nil이기 때문입니다.

+0

strlen()도 문제가있는 것으로 보았습니다. 그러나 나는 애플이 함수에 전달 된 값을 무효로 처리하는 방법을 알 수 없다. 그들이 사용한 입력을 제공했다면 좋았을 것입니다. 오류가 발생하는 함수에서 테스트를합니다. if ([InputField.text isEqualToString : @ ""]) 및 오류가 else 절에 나오므로 절대로 값을 전달할 수 없어야합니다. – Jacob

+0

맨 위에는 다음과 같은 보조 함수에서 게시 한 메서드 만 호출합니다. + (NSString *) complete256Hash : (NSString *) cStr { NSUserDefaults * prefs = [NSUserDefaults standardUserDefaults]; NSString * SHA1Para = [prefs stringForKey : @ "SpecialKey1"]; NSString * SHA2Para = [prefs stringForKey : @ "SpecialKey2"]; NSString * hash = [cStr stringByAppendingString : SHA1Para]; hash = [유틸리티 sha256 : 해시]; hash = [해시 stringByAppendingString : SHA2Para]; hash = [유틸리티 sha256 : 해시]; 리턴 해시; } – Jacob

+0

기기에서 앱을 처음 시작하면 userDefaults가 아직 존재하지 않고 stringForKey :가 nil을 반환하므로 sha256을 nil 매개 변수로 호출합니다. nil이 전달되면 sha256 메소드를 종료해야합니다. – Johnmph

0

어쩌면 당신이 찾고있는 nil clear은 한 명의 메모리 경고 (애플 리뷰 작성자가 앱의 동작을 관찰하기 위해 적극적으로 생성)에서 온 것일 수 있습니다.

+0

잘 이해하면 Apple에서 자체 메모리 경고를 생성합니까? 나는 문자열 값이 비어 있지 않은지 검사하는 코드에서 더 이상이 없기 때문에 변수가 nil이 될 수 없기 때문에 nil을 검사하지 않았다. 그렇다면 얼마나 많은 곳에서 무조건 체크 할 필요가 있습니까? 대부분의 코드에서 iOS 용 웹에서 상수가 아닌 체크가 추가되었습니다. – Jacob

+0

ARC를 사용하고 있는지 묻지 않으 셨습니다. 그렇지 않을 경우 메모리 경고 문제 일 수 있습니다. – meyo

+0

메모리 경고는 몇 가지 레벨을 가지고 있으며 시스템에서 메모리를 청소하도록합니다. 따라서보기 또는 속성과 같은 일부 데이터를 다시 초기화해야합니다. 따라서 일부 리소스를로드 한 다음 임의의 메모리 경고를로드하면 일부 nils . 에뮬레이터에는 원하는 수준의 메모리 경고를 시뮬레이트하는 옵션이 있습니다. 몇 가지 테스트를 수행하면 문제가 삭제됩니다 (또는 그렇지 않은 경우). – meyo

관련 문제