Я недавно писал код для пользовательского протокола последовательной связи. То, что я сделал, я использовал часть (8/16 бит) принимаемых данных, чтобы обозначить, насколько большой размер кадра. Исходя из этих данных, я ожидаю , что нет данных. Я использую Crc для принятия или отклонения кадра. Но я не смогу включить длину кадра данных в Crc, так как на принимающей стороне я должен знать, сколько данных ожидать, до обработки кадра.Как предотвратить переполнение буфера/переполнение массива?
Проблема, с которой я столкнулся, иногда эти данные длины кадра повреждаются, и он обманывает приемник, получая столько байтов, в то время как размер принимающего массива намного меньше. Это искажает множество критических системных переменных, которые присутствуют в последовательных ячейках памяти.
Как предотвратить переполнение буфера? Мои мысли об этом 1) Отклоните данные framelength, если они превышают определенное значение. 2) используйте тип данных, который ограничивает максимальный номер. Подобно использованию короткого замыкания, ограничивающего область индекса массива до 256 мест памяти и создание буфера с 280 байтами. 3) выделяет память в отдельном месте, чтобы она не влияла на критические системные переменные.
Одна вещь, которую я использовал для предотвращения застревания в приемном цикле, - это тайм-аут. Но я не обратил внимания на этот аспект проблемы. Мне кажется, что мне нужно много времени, чтобы подтвердить и воспроизвести проблему, поскольку, таким образом, код является частью более крупного системного кода, и я не эксперт здесь.
Как можно безопасно справляться с такими проблемами?
Также: какие общие соображения или стандартные методы следует использовать при использовании массива, чтобы предотвратить его переполнение?
Простите меня, если я неправильно использовал некоторые термины. – seetharaman
Я бы сказал, 2) правильный ответ. (Хотя 'short' - 2 байта, а то, что вы хотите, - это однобайтовое значение.) – user3386109
Я не понимаю, как поврежденные данные длины кадра могут исказить приемник в переполнении буфера. Разумеется, приемник точно считывает количество байтов, которые, как ему сказали, ожидают (или пытается это сделать), и он находится в пределах мощности приемника, чтобы гарантировать, что у него есть достаточный буфер для этого, даже если принятый размер кадра неверен. –