Понимание распределения памяти NSS PK11_CipherOp и C - PullRequest
0 голосов
/ 04 декабря 2009

Возникли проблемы с 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.

Я не могу понять, почему первая строка работает надежно, а вторая - нет!

Чтобы увидеть полный код, см. Источник файла

Спасибо,

Hamilton

Ответы [ 2 ]

3 голосов
/ 04 декабря 2009

Похоже, ваша проблема в отсутствующей декларации для 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, и вы должны быть в порядке (есть еще один позже) ...

0 голосов
/ 05 декабря 2009

Нашел проблему. Оказывается, я использовал sizeof(outbuf) в качестве одного из параметров. Когда outbuf объявлен в стеке, как char outbuf[1024];, это возвращает 1024. Однако, когда outbuf находится в куче, как char * outbuf = malloc(1024);, размер outbuf равен 4. Этот параметр сообщает функции, сколько места было доступно outbuf, поэтому функция считала, что у нее есть только 4 байта места. Ему нужно 16, чтобы сделать что-нибудь , поэтому он просто вернулся, не выполняя никакой работы.

...