为什么“SecStaticCodeCheckValidity”方法钻出我的记忆?

问题描述:

我有一个验证代码签名的应用程序。我正在使用SecStaticCodeCheckValidity来检查签名是否有效。在我调用这个方法之前,我有一个相对较小的内存占用量,但是在方法执行完成后,我的内存占用空间几乎增加了一倍,我不知道究竟发生了什么。为什么“SecStaticCodeCheckValidity”方法钻出我的记忆?

OSStatus errorCode=SecStaticCodeCheckValidity(_codeReference, kSecCSConsiderExpiration,NULL); 
    CFRelease(_codeReference); 
    switch(errorCode) 
    { 
      case errSecInvalidRoot:validity=INVALID; 
       break; 
      case errSecCRLNotValidYet:validity=NOT_VALID_YET; 
       break; 
      case errSecCertificateRevoked:validity=REVOKED; 
       break; 
      case errSecCertificateExpired:validity=EXPIRED; 
       break; 
      case errSecSuccess:_signatureValidity=VALID; 
       break; 
      default: validity=BROKEN; 
       break; 
    } 

现在当我已经发布“_codeReference”的时候,我应该发布什么?

UPDATE:

#import <Foundation/Foundation.h> 
#import <Security/Security.h> 
int main(int argc, const char * argv[]) { 
    SecStaticCodeRef codeRef; 
    CFURLRef appURL=CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/Applications/Xcode.app"), kCFURLPOSIXPathStyle, YES); 
    SecStaticCodeCreateWithPath(appURL, kSecCSDefaultFlags, &codeRef); 
    CFRelease(appURL); 
    CFDictionaryRef signDic; 
    SecCodeCopySigningInformation(codeRef, kSecCSSigningInformation, &signDic); 
    if(!CFDictionaryContainsKey(signDic,kSecCodeInfoIdentifier)) 
    { 
     NSLog(@"Bundle not signed...."); 
     return 0; 
    } 
    CFRelease(signDic); 
    //Verify signature 
    OSStatus code=SecStaticCodeCheckValidity(codeRef, kSecCSConsiderExpiration, NULL); 
    CFRelease(codeRef); 
    NSString*output; 
    switch(code) 
    { 
     case errSecInvalidRoot:[email protected]"INVALID"; 
      break; 
     case errSecCRLNotValidYet:[email protected]"NOT_VALID_YET"; 
      break; 
     case errSecCertificateRevoked:[email protected]"REVOKED"; 
      break; 
     case errSecCertificateExpired:[email protected]"EXPIRED"; 
      break; 
     case errSecSuccess:[email protected]"VALID"; 
      break; 
     default: [email protected]"BROKEN"; 
      break; 
    } 
    NSLog(@"%@",output); 
    return 0; 
} 

我已经更新了我的SampleApplication和监测仪器中的应用。 enter image description here 这意味着我没有正确释放我的代码中的内存。

+1

你怎么知道这实际上是泄漏? –

+0

我一直在用Activity Monitor和Xcode监视内存。在Xcode中,我一直在使用内存图进行调试。我只是认为我可以使用codesign对shell进行验证,但不幸的是,codesign似乎有同样的问题。 – ok404

+1

'codesign'虽然没有连续运行;它运行然后退出。上面的代码中没有任何内容,但应该是泄漏。如果您有该行为的调试日志,那么我建议您将它们与您的问题一起发布。 –

好吧,我重写我的代码使用ARC后,所有的内存问题都消失了。所以实际上我的错是对象没有正确释放。