AUTOSAR C++14 Rule A26-5-1

Псевдослучайные числа не должны быть сгенерированы с помощью std::rand().

Описание

Управляйте определением

Псевдослучайные числа не должны быть сгенерированы с помощью std::rand().

Объяснение

Это криптографически слабые стандартные программы предсказуемы и не должны использоваться в целях безопасности. Когда предсказуемое случайное значение управляет потоком выполнения, ваша программа уязвима для вредоносных атак.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#include <stdio.h>
#include <stdlib.h>

volatile int rd = 1;
int main(int argc, char *argv[])
{   
    int j, r, nloops;
    struct random_data buf;
    int i = 0;
    
    nloops = rand();
    
    for (j = 0; j < nloops; j++) {
        if (random_r(&buf, &i))
            exit(1);
        printf("random_r: %ld\n", (long)i);
    }
    return 0;
}

Этот пример использует rand и random_r сгенерировать случайные числа. Если вы используете эти функции в целях безопасности, эти PRNGs могут быть источником вредоносных атак.

Коррекция — использует более сильный PRNG

Одна возможная коррекция должна заменить уязвимый PRNG на более сильный генератор случайных чисел.

#include <stdio.h>
#include <stdlib.h>
#include <openssl/rand.h>

volatile int rd = 1;
int main(int argc, char* argv[])
{   
    int j, r, nloops;
    unsigned char buf;
    unsigned int seed;
    int i = 0;
    
    if (argc != 3) 
    {
        fprintf(stderr, "Usage: %s <seed> <nloops>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    
    seed = atoi(argv[1]);
    nloops = atoi(argv[2]);
    
    for (j = 0; j < nloops; j++) {
        if (RAND_bytes(&buf, i) != 1)
            exit(1);
        printf("RAND_bytes: %u\n", (unsigned)buf);
    }
    return 0;
}

Проверяйте информацию

Группа: библиотека Algorithms

Введенный в R2019a