Понимание распределения памяти 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.
Не могу понять, почему первая линия работает надежно, а вторая нет!
Чтобы увидеть полный код, см. Источник файла
Спасибо,
Гамильтон
Решение
Похоже, ваша проблема заключается в отсутствии декларации для 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
и вам пора идти (позже будет еще один)...
Другие советы
Нашел проблему.Оказывается, я использовал sizeof(outbuf)
как один из параметров.Когда outbuf объявлен в стеке, как char outbuf[1024];
это возвращает 1024.Однако, когда outbuf находится в куче, как char * outbuf = malloc(1024);
размер outbuf всего 4.Этот параметр сообщал функции, сколько места доступно в outbuf, поэтому функция считала, что у нее есть только 4 байта места.Для этого нужно 16 что-либо поэтому он просто вернулся, не выполнив никакой работы.