了解NSS PK11_CipherOp和C内存分配

时间:2009-12-04 04:05:23

标签: c encryption memory-management nss

有一些问题C.我有这个是我的代码:

// First line works, second line does not! 
char outbuf[1024];
// char *outbuf = (char *) malloc(1024);  // char is always 1

我将这个outbuf传递给在NSS库中声明的名为PK11_CipherOp()的方法。可以找到此方法的文档here,您可以看到它需要一个char *的outbuf参数。

我无法理解为什么第一行可靠地工作,第二行不能!

要查看完整代码,请参阅File Source

谢谢,

汉密尔顿

2 个答案:

答案 0 :(得分:3)

您的问题似乎是malloc的遗漏声明 - 您尚未加入<stdlib.h>

这意味着您的编译器假设函数返回int,然后将其显式转换为(unsigned char *)。如果你在sizeof(int) != sizeof(void *)的平台上,比如x86-64,那么这将破坏指针值。

这完全说明了为什么在C(不像C ++)中你应该强制转换malloc()的结果 - 这样做是不必要的,并且隐藏了这个确切的错误。它还说明了为什么要启用编译器警告。

修复方法是#include <stdlib.h>,并在您出现时从malloc()移除广告。

<强>附录:

您的另一个问题是您将sizeof(outbuf)传递给PK11_CipherOp()。当out_buf_size是数组时,这将是正确的(等于outbuf),但当outbuf是指针时,它是不正确的(指针本身的大小

将每个sizeof(outbuf)替换为out_buf_size,您应该好好去(之后还有另一个)......

答案 1 :(得分:0)

发现了这个问题。事实证明我使用sizeof(outbuf)作为参数之一。当在堆栈上声明outbuf时,如char outbuf[1024];这返回1024.但是,当outbuf在堆上时,如char * outbuf = malloc(1024); outbuf的大小只有4.这个参数告诉函数有多少空间在outbuf中可用,因此函数认为它只有4个字节的空间。它需要16来做任何所以它只是返回而不执行任何工作。