Что можно ввести в следующую программу для доступа к массиву? - PullRequest
0 голосов
/ 05 июля 2018

Поскольку x на самом деле не проверено и получено через scanf, должны быть потенциально испорченные данные, которые можно использовать для доступа к bytes.

Код (на самом деле не логично делать что-либо продуктивное):

void getMyBytes(){
    int x, byte;
    int bytes[20];
    scanf("%u %u", &x, &byte);
    bytes[x-1] = byte;
}

Известное простое (безобразное) исправление для этого кода:

void getMyBytes(){
    int x, byte;
    int bytes[20];
    scanf("%u %u", &x, &byte);
    if (x > sizeof(bytes)/sizeof(*bytes)) return;    --> validation fix
    bytes[x-1] = byte;
}

Какие входные данные я могу ввести в scanf, чтобы получить доступ к bytes?

1 Ответ

0 голосов
/ 05 июля 2018

Это зависит от вашего приложения, но вы всегда должны проверять внешний вход при доступе к своим внутренним участникам. Как вы сообщаете об этом, зависит от вас. Но вы можете использовать std::vector или std::array, чтобы помочь вам. В вашем примере:

void getMyBytes(){
    int x, byte;
    std::array<int, 20> bytes; // Bad name btw, an int is very unlikely to be a byte.
    scanf("%u %u", &x, &byte); // scanf is not type safe. Consider using cin <<
    bytes.at(x-1) = byte; // Automatically bound checks for you and will throw an exception
                          // in the case that you are out of bounds. Very useful :)
}

std::array::at

Возвращает ссылку на элемент в указанном месте pos с проверкой границ. Если pos находится вне диапазона контейнера, генерируется исключение типа std :: out_of_range.

Другие способы сообщения об ошибке:

  1. Тяжелая смерть в отладке: assert(x >= 0 && x < bytes.size() && "I crashed here because you gave me bad input!")
  2. Ошибка, сообщенная вызывающей функции: if (x < 0 || x > bytes.size()) { return false; }
  3. Бросок с дополнительной информацией: if (x < 0) { throw my_special_underrun_exception; } и if (x > bytes.size()) { throw my_special_overrun_exception; }

Наконец, посетите CppCoreGuidelines , чтобы получить множество советов о том, как написать хороший код.

...