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