Место записи о нарушении прав доступа - PullRequest
0 голосов
/ 02 декабря 2009

У меня есть следующий код:

#include <openssl/bn.h>
#include <openssl/rsa.h>

unsigned char* key;
RSA* rsa = RSA_new();
rsa = RSA_generate_key(1024,65537,NULL,NULL);
//init pubkey
key[BN_num_bytes(rsa->n)] = '\0';
BN_bn2bin(rsa->n, key);
printf("RSA Pub: %s\n", key);
RSA_free( rsa );
rsa = NULL;

Отладчик сообщает мне, что у меня есть проблема "Место записи нарушения доступа" в строке

key[BN_num_bytes(rsa->n)] = '\0';

Если я закомментирую эту строку, проблема просто опустится до

BN_bn2bin(rsa->n, key);

любые предложения о том, как решить эту проблему, было бы замечательно.

Ответы [ 4 ]

2 голосов
/ 02 декабря 2009

Поскольку key ни на что не указывает, и вы ссылаетесь на него с помощью индексации массива, то есть источника. Как ключ получает значение. Вы перезаписываете или попираете какой-то другой блок памяти, который не принадлежит вам, следовательно, «нарушение прав доступа», зафиксированное окнами. Дважды проверьте код и убедитесь, что переменная была malloc'd или new'd.

Как примечание, для вашего здравомыслия лучше всего объявить это так:

unsigned char *key = NULL;

Таким образом, если вы попытаетесь получить доступ к key без malloc'd / new'd, вы получите ошибку исключения из памяти (которая может быть легко исправлена) Учтите, что это значительно облегчает отладку.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 02 декабря 2009

Вы не выделяете память для ключа - в первый раз он используется, когда вы пытаетесь установить элемент на 0.

1 голос
/ 02 декабря 2009

У вас есть нарушение прав доступа, потому что вы пытаетесь назначить ключ с нулевым терминатором, но вы не выделили память для ключа.Нам нужно знать, чего вы пытаетесь достичь.

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

Правильное решение для выделения нужного количества памяти в этом случае:

key = malloc(BN_num_bytes(rsa->n));
BN_bn2bin(rsa->n, key);
...