поскольку 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
?
Это зависит от вашего приложения, но вы всегда должны проверять внешний вход при доступе к своим внутренним членам. Как вы сообщаете об этом, зависит от вас. Но подумайте об использовании 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 :)
}
Возвращает ссылку на элемент в указанном месте pos с проверкой границ.
Если pos находится вне диапазона контейнера, генерируется исключение типа std :: out_of_range.
Другие способы сообщить об ошибке:
assert(x >= 0 && x < bytes.size() && "I crashed here because you gave me bad input!")
if (x < 0 || x > bytes.size()) { return false; }
if (x < 0) { throw my_special_underrun_exception; }
а также if (x > bytes.size()) { throw my_special_overrun_exception; }
Наконец рассмотрите посещение CppCoreGuidelines множество советов о том, как написать хороший код.
Других решений пока нет …