SecVerifyTransform创建内存泄漏?

时间:2017-01-17 15:20:02

标签: c++ macos memory-leaks

请使用以下代码:

// init
CFDataRef signature = CFDataCreate(...);
CFDataRef pubKeyData = CFDataCreate(...);

CFArrayRef array = NULL;
OSStatus res = SecItemImport(pubKeyData, ..., &array);
SecKeyRef pubKey = (SecKeyRef) CFArrayGetValueAtIndex(array, 0);

// everything goes wrong here
SecTransformRef verifier = SecVerifyTransformCreate(pubKey, signature, NULL);

// release
CFRelease(signature);
CFRelease(pubKeyData);
CFRelease(signature);
CFRelease(verifier);

简而言之:我从文件导入公钥和签名,为该签名创建验证器。在接下来的代码行中,我能够成功验证签名。

我关注的是调用 SecVerifyTransformCreate 方法时发生的内存泄漏。如果我注释掉那条线,那么泄漏就会消失。

我已经阅读了所有关于创建规则获取规则的内容,我想我已经发布了这些版本。

1 个答案:

答案 0 :(得分:1)

经过一些广泛的测试,这是我发现的:

如上所述,在上面的代码后面的行上,我执行验证程序来检查签名是否正确,重要的方法是:

CFTypeRef result = SecTransformExecute(verifier, NULL);

如果我不包含这行代码,Xcode的 Instrumentation 工具中可以观察到320B泄漏(每次调用)。

我认为方法 SecVerifyTransformCreate 会分配一些内存,并希望您调用 SecTransformExecute ,然后释放它。如果你不这样做,就会发生泄漏。 IMO认为这是错误的行为。

正如弗兰克所提到的,即使没有可观察到的泄漏,操作系统报告的内存使用量也会增长,但不会呈指数级增长(在我的情况下,它停止在40MB左右)。这是正确的行为。

感谢弗兰克的精心制作。