Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Февраль 29, 2016, 11:48



Название: Надежное чтение
Отправлено: Igors от Февраль 29, 2016, 11:48
Добрый день

"Надежное" значит если в файле невалидные данные, то юзеру показывается месяга что файл не может быть прочитан, но приложение продолжает нормально работать. Смотрю исходники
Код
C++ (Qt)
template<typename T>
QDataStream& operator>>(QDataStream& s, QVector<T>& v)
{
   v.clear();
   quint32 c;
   s >> c;
   v.resize(c);
...
 
Пусть в файле полный бред и "с" равно какому-то фантастическому числу. В рез-те 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.