Russian Qt Forum
Ноябрь 22, 2024, 21:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Надежное чтение  (Прочитано 5549 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Февраль 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 памяти - и это может пройти. Как это пресечь? Или не пресекать уповая на то что рано или поздно случится исключение которое откатит стек?

Спасибо
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #1 : Февраль 29, 2016, 12:11 »

А CRC чем не подходит?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Февраль 29, 2016, 12:14 »

Как мне кажется, проверять надо раньше, на этапе чтения сигнатуры файла и т.д.
То есть если с самого начала понятно, что "читаем мусор" - то все, стоп машина.

Если же беспокоит конкретно данный участок кода и "мусором" будет считаться то, что с может превышает некий лимит - то стоит сразу выкатывать ошибку и стопорить процесс.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #3 : Февраль 29, 2016, 13:24 »

Если рассматривать сам метод бинарной десериализации, то никаких защит в нем не должно быть - этим должен заниматься протокол обмена.

Проверять необходимо пакет данных, который может представлять собой файл, пакет TCP|UDP и др. Анализирует содержимое пакета соответствующий парсер.
Для этого пакет должен иметь внутри встроенный механизм определения корректности/целостности данных. К ним относятся различные виды контрольных сумм, магические числа (для определения, например, формата данных) и любая другая информация.

Таким образом, читаем файл целиком, как один пакет, например, QByteArray. Анализируем содержимое. Если что-то нас не устраивает -> сообщение об ошибке. Если все ок -> десериализуем данные.
Если файл большой и не влезает в QByteArray, то желательно организовать его в виде набора пакетов. В общем случае файла произвольного формата задача не решается, должна быть возможность чтения в виде небольших блоков/порций, которые можно анализировать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 29, 2016, 15:24 »

Если файл большой и не влезает в QByteArray, то желательно организовать его в виде набора пакетов.
Мне больше нравится "тегов". Так и есть, др разумных ходов нет. И что, по каждому тегу считать CRC? Не выглядит реально, слишком обременяет и чтение и запись. Для всего файла смысл есть, но и то - напр файл может быть неск Gb, а грузится лишь небольшая часть, остальное - по мере необходимости и частями.

Если рассматривать сам метод бинарной десериализации, то никаких защит в нем не должно быть - этим должен заниматься протокол обмена.
А что он (протокол) сделать может? Ну проверить заголовок и (иногда) сбивается ли длина? Что еще?

Меня бы вполне устроило исключение если началось чтение "за пределами тега", но не вижу как его удобно сделать
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Февраль 29, 2016, 16:14 »

Для всего файла смысл есть, но и то - напр файл может быть неск Gb, а грузится лишь небольшая часть, остальное - по мере необходимости и частями.

Насколько помню протокол bittorrent так и работает -- файл делится по частям, каждая из которых хешируется
Записан

Bepec
Гость
« Ответ #6 : Февраль 29, 2016, 17:37 »

Проверки и только проверки на валидность данных.
 
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #7 : Февраль 29, 2016, 21:00 »

И что, по каждому тегу считать CRC? Не выглядит реально, слишком обременяет и чтение и запись.
Если требуется гарантия, то только так. И ни так уж это обременительно, как кажется. А если пользоваться, например, TCP/IP, то это гарантирует сам протокол.

А что он (протокол) сделать может? Ну проверить заголовок и (иногда) сбивается ли длина? Что еще?
Обычно этого в подавляющем большинстве случаев достаточно. Либо используют что-то типа xml.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 22.