#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 }