NSS PK11_CipherOp と C メモリ割り当てについて
-
12-09-2019 - |
質問
Cに関してはいくつか問題があります。これが私のコードです:
// First line works, second line does not!
char outbuf[1024];
// char *outbuf = (char *) malloc(1024); // char is always 1
この outbuf を というメソッドに渡します PK11_CipherOp()
, 、NSS ライブラリで宣言されています。このメソッドのドキュメントは次のとおりです。 ここ, を期待していることがわかります。 char *
outbuf パラメータ用。
最初の行は確実に機能するのに、2 行目は機能しない理由が理解できません。
完全なコードを確認するには、を参照してください。 ファイルソース
ありがとう、
ハミルトン
解決
あなたの問題は、次の宣言が欠落しているようです 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 つあります)...
他のヒント
問題を発見しました。私は、パラメータの1つとしてsizeof(outbuf)
を使用していたことが分かりました。 outbufには、スタック上で宣言されている場合は、char outbuf[1024];
としてはoutbufのはoutbufのサイズは、多くの部屋がoutbufをで利用できたかだけ4.このパラメータは、関数を語っているchar * outbuf = malloc(1024);
として、ヒープ上にあるとき、しかし、1024を返すので、機能はそれだけで部屋の4つのバイトを持っていたことを考えました。それだけですべての作業を実行せずに返されたので、それはの何でもの行うために16を必要とします。