Название: Надежное чтение Отправлено: Igors от Февраль 29, 2016, 11:48 Добрый день
"Надежное" значит если в файле невалидные данные, то юзеру показывается месяга что файл не может быть прочитан, но приложение продолжает нормально работать. Смотрю исходники Код Пусть в файле полный бред и "с" равно какому-то фантастическому числу. В рез-те resize может запросить напр неск Gb памяти - и это может пройти. Как это пресечь? Или не пресекать уповая на то что рано или поздно случится исключение которое откатит стек? Спасибо Название: Re: Надежное чтение Отправлено: Swa от Февраль 29, 2016, 12:11 А CRC чем не подходит?
Название: Re: Надежное чтение Отправлено: Racheengel от Февраль 29, 2016, 12:14 Как мне кажется, проверять надо раньше, на этапе чтения сигнатуры файла и т.д.
То есть если с самого начала понятно, что "читаем мусор" - то все, стоп машина. Если же беспокоит конкретно данный участок кода и "мусором" будет считаться то, что с может превышает некий лимит - то стоит сразу выкатывать ошибку и стопорить процесс. Название: Re: Надежное чтение Отправлено: ssoft от Февраль 29, 2016, 13:24 Если рассматривать сам метод бинарной десериализации, то никаких защит в нем не должно быть - этим должен заниматься протокол обмена.
Проверять необходимо пакет данных, который может представлять собой файл, пакет TCP|UDP и др. Анализирует содержимое пакета соответствующий парсер. Для этого пакет должен иметь внутри встроенный механизм определения корректности/целостности данных. К ним относятся различные виды контрольных сумм, магические числа (для определения, например, формата данных) и любая другая информация. Таким образом, читаем файл целиком, как один пакет, например, QByteArray. Анализируем содержимое. Если что-то нас не устраивает -> сообщение об ошибке. Если все ок -> десериализуем данные. Если файл большой и не влезает в QByteArray, то желательно организовать его в виде набора пакетов. В общем случае файла произвольного формата задача не решается, должна быть возможность чтения в виде небольших блоков/порций, которые можно анализировать. Название: Re: Надежное чтение Отправлено: Igors от Февраль 29, 2016, 15:24 Если файл большой и не влезает в QByteArray, то желательно организовать его в виде набора пакетов. Мне больше нравится "тегов". Так и есть, др разумных ходов нет. И что, по каждому тегу считать CRC? Не выглядит реально, слишком обременяет и чтение и запись. Для всего файла смысл есть, но и то - напр файл может быть неск Gb, а грузится лишь небольшая часть, остальное - по мере необходимости и частями. Если рассматривать сам метод бинарной десериализации, то никаких защит в нем не должно быть - этим должен заниматься протокол обмена. А что он (протокол) сделать может? Ну проверить заголовок и (иногда) сбивается ли длина? Что еще?Меня бы вполне устроило исключение если началось чтение "за пределами тега", но не вижу как его удобно сделать Название: Re: Надежное чтение Отправлено: gil9red от Февраль 29, 2016, 16:14 Для всего файла смысл есть, но и то - напр файл может быть неск Gb, а грузится лишь небольшая часть, остальное - по мере необходимости и частями. Насколько помню протокол bittorrent так и работает -- файл делится по частям, каждая из которых хешируется Название: Re: Надежное чтение Отправлено: Bepec от Февраль 29, 2016, 17:37 Проверки и только проверки на валидность данных.
Название: Re: Надежное чтение Отправлено: ssoft от Февраль 29, 2016, 21:00 И что, по каждому тегу считать CRC? Не выглядит реально, слишком обременяет и чтение и запись. Если требуется гарантия, то только так. И ни так уж это обременительно, как кажется. А если пользоваться, например, TCP/IP, то это гарантирует сам протокол.А что он (протокол) сделать может? Ну проверить заголовок и (иногда) сбивается ли длина? Что еще? Обычно этого в подавляющем большинстве случаев достаточно. Либо используют что-то типа xml. |