Сбой доступа к памяти в моей функции RNG при использовании memcpy

#c #memcpy

#c #memcpy

Вопрос:

Я получаю сбой доступа к памяти при попытке скопировать элемент из моего случайного массива. Я понятия не имею, что я делаю не так, заранее спасибо за вашу помощь.

Вот мой код:

   1 #include <TSS_API_RNG.h>
  2
  3 using namespace std;
  4
  5 // dummy rng for internal speed tests
  6 void rng(uint8_t out[], size_t len) {
  7
  8    unsigned char iv[len];
  9    size_t i, k;
 10    srand(time(NULL));
 11      for (i = 0; i < len; i  ) {
 12      k = rand()%256;
 13      iv[i] = (unsigned char)k;
 14      cout << iv[i] << endl;
 15
 16      memcpy(amp;out[0], amp;iv[0], len);
 17      cout << amp;out[0] << endl;
 18      memset(amp;iv[0], 0x00, len);
 19   }
 20 }
 21
 22 int main() {
 23
 24    rng(NULL, 10);
 25    return 0;
 26 }
  

И это то, что происходит, когда я пытаюсь выполнить свою программу:

 pi@raspberrypi:~/projects/RNG_final $ ./DUMMY_RNG
▒
Speicherzugriffsfehler
  

Должно быть, я неправильно использую memcopy функцию, но я понятия не имею, как решить эту проблему. Для тестирования я хотел передать 10 случайных чисел, но это не удается на первой итерации memcpy . Сам цикл работает правильно, следовательно, он правильно выводит значение в первом cout значении.

Комментарии:

1. Скажите мне, на memcpy(amp;out[0], amp;iv[0], len); что amp;out[0] указывает?

2. NULL это неподходящее место для записи чего-либо.

3. Обратите внимание, что srand / rand не предоставляют случайные числа очень хорошего качества (и time(NULL) это ужасное начальное значение — и вы должны запускать генератор только один раз, а не при каждом вызове вашей функции). Возможно, вы захотите изучить современные средства случайного доступа в <random> заголовке / библиотеке. Кроме того, возможно, просмотр rand () считается вредным — это хороший разговор.

4. Последнее memset(amp;iv[0], 0x00, len); в rng не имеет никакого смысла — все, с чем вы там работаете, выйдет за рамки, когда функция завершится, так почему вы вообще беспокоитесь об этой строке? Это бессмысленно.

5. Обязательное предупреждение VLA . unsigned char iv[len]; не является законным C . В границах массива C должны быть константы времени компиляции.

Ответ №1:

Спасибо, ребята, удалось устранить проблему с помощью вашего совета.

Мой код:

   1 #include <TSS_API_RNG.h>
  2
  3 using namespace std;
  4
  5 // constructor
  6 DUMMY_RNG::DUMMY_RNG()
  7   :r_len(0), r_count(0)
  8 {
  9    std::cout << "Neue Instanz" << std::endl;
 10 }
 11
 12
 13 // destructor
 14 DUMMY_RNG::~DUMMY_RNG(void)
 15 {
 16 }
 17
 18
 19 // dummy rng for internal speed tests
 20 int DUMMY_RNG::rng(uint8_t out[], size_t len) {
 21
 22    unsigned char iv[len];
 23    size_t k;
 24    srand(time(NULL));
 25      //for (i = 0; i < len; i  ) {
 26      k = rand()%256;
 27      iv[0] = (unsigned char)k;
 28
 29      memcpy(amp;out[0], amp;iv[0], len);
 30      memset(amp;iv[0], 0x00, len);
 31   //}
 32     return 1;
 33 }
 34
 35
 36 // randomize function replacement from botan rng class
 37 void DUMMY_RNG::randomize(uint8_t out[], size_t len)
 38 {
 39    r_count  = 1;
 40    r_len  = len;
 41
 42    rng(out, len);
 43 }