为什么“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;
}
答
好吧,我重写我的代码使用ARC后,所有的内存问题都消失了。所以实际上我的错是对象没有正确释放。
你怎么知道这实际上是泄漏? –
我一直在用Activity Monitor和Xcode监视内存。在Xcode中,我一直在使用内存图进行调试。我只是认为我可以使用codesign对shell进行验证,但不幸的是,codesign似乎有同样的问题。 – ok404
'codesign'虽然没有连续运行;它运行然后退出。上面的代码中没有任何内容,但应该是泄漏。如果您有该行为的调试日志,那么我建议您将它们与您的问题一起发布。 –