2009-12-04 56 views
0

經與C.一些問題,我有,這是我的代碼:瞭解NSS PK11_CipherOp和C內存分配

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

我傳遞這outbuf中一個叫PK11_CipherOp()方法,在NSS庫中聲明。這個方法的文檔可以找到here,你可以看到它預計outbuf參數爲char *

我不明白爲什麼第一行可靠工作,第二行不行!

要查看完整的代碼,請參閱File Source

感謝,

漢密爾頓

回答

3

您的問題似乎是malloc缺少聲明 - 您還沒有<stdlib.h>

這意味着您的編譯器假定函數返回int,然後將其明確地轉換爲(unsigned char *)。如果你在一個像x86-64那樣的平臺上,那麼這將破壞指針值。

這完全說明了爲什麼在C(不像C++),你應該malloc()結果 - 這樣做是不必要的,從你隱藏了這個確切的錯誤。它還說明了爲什麼你應該打開編譯器警告。

修復程序爲#include <stdlib.h>,並在您到達時從malloc()刪除演員。

附錄:

你的另一個問題是,你傳遞給sizeof(outbuf)PK11_CipherOp()。這將是正確的(等於out_buf_size),當outbuf是一個數組,但是不正確時(指針本身的大小)當outbuf是一個指針時。

替換每個sizeof(outbuf)out_buf_size,你應該是好去(還有另外一個後太)發現問題...

+0

caf, 感謝您的幫助。不幸的是,這並沒有解決問題。我有警告(並沒有得到關於聲明malloc的一個),但我實現你的解決方案只是爲了確保。 您可以在http://code.google.com/p/sysecure/source/browse/trunk/session_keys.c上看到更新的源代碼。R = 27#119 當運行時,該打印: sysecure:嘗試加密消息 sysecure當錯誤:錯誤執行密碼操作(ERR -8189) sysecure:錯誤名稱 - ((空)) sysecure:錯誤消息 - (未知代碼___f 3) 和標準錯誤 加密數據: 數據長度0 任何想法真的會幫助我。 – Hamy 2009-12-04 19:43:48

+0

是的,還有第二個問題 - 請參閱我的更新答案。 – caf 2009-12-05 01:14:13

0

。原來,我使用sizeof(outbuf)作爲參數之一。當outbuf在堆棧上聲明時,如char outbuf[1024];這將返回1024.但是,當outbuf在堆上時,如char * outbuf = malloc(1024); outbuf的大小僅爲4.此參數告訴函數outbuf中有多少空間可用,因此函數認爲它只有4個字節的空間。它需要16做什麼所以它只是返回沒有執行任何工作。