LINUX.ORG.RU

mapped_file_source: исключение на пустом файле

 ,


0

3

После нормального получения хэша нескольких файлов обломался на файле нулевой длины и соорудил тест.

std::string emptyname = "zero.cpp"; // Тестовый файл нулевой длины
unsigned char emptyhash[MD5_DIGEST_LENGTH];
boost::iostreams::mapped_file_source emptymap;
emptymap.open(emptyname);
if (emptymap.is_open()) {
    MD5( (unsigned char*) emptymap.data(), emptymap.size(), emptyhash );
    emptymap.close();
}
Вылетает с сообщением
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::exception> >'
  what():  std::exception
Aborted
Можно заранее проверять файл на ненулевую длину, но какого лешего?

Гугл дал подтверждение только в одном электрописьме, которое ничего не прояснило.

★★★★

ЯННП, но как ты собираешься считать MD5 от несуществующих данных?

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

MD5 от пустой строки вполне считается и равна d41d8cd98f00b204e9800998ecf8427e.

Есть маленькая, но ненулевая вероятность, что файл может быть обрезан после того, как я определил его размер, но до того, как я посчитал его хэш. И вообще, в чём проблема открыть для чтения пусть даже нуль-байтный файл?

Xenesz ★★★★ ()

А отладчиком сложно пройтись и посмотреть почему исключение появляется?

invy ★★★★★ ()

лет 5 назад на этоже нарвался. собссно сделал просто

    if(size) {
        boost::iostreams::mapped_file mapped(path, boost::iostreams::mapped_file::readonly );
        md5 = md5_type(mapped.const_data(), mapped.size()).to_base64();
    } else {
        md5 = md5_type("",0).to_base64();
    }
anonymous ()
Ответ на: комментарий от anonymous

Ну я похожий воркараунд настрочил, но это ещё одна обработка особого случая, как мне кажется, на ровном месте, и это не радует.

Xenesz ★★★★ ()

а как он, по-твоему, должен мапить несуществующие данные? вполне логично бросать исключение. лови исключение и обрабатывай. в чём проблема-то?

Iron_Bug ★★★★ ()
Ответ на: комментарий от Iron_Bug

Вернуть указатель и размер (ноль), не? Причём указатель можно в принципе взять от балды любой в доступной памяти, всё равно его разыменовывать нет необходимости.

Xenesz ★★★★ ()
Ответ на: комментарий от Xenesz

это класс для работы с отмапленными файлами. всё, что отмапленным файлом не является, не имеет к нему отношения. если есть желание - напиши класс-обёртку, который будет реализовывать дополнительный функционал. это делается элементарно.
просто в программировании принято строго разделять функциональность классов вместо создания никому не нужных «божественных объектов», перегруженных лишним барахлом.

Iron_Bug ★★★★ ()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Xenesz

MD5 от пустой строки вполне считается

на самом деле, от пустой? или, всё-таки, от «» ?

anonymous ()
Ответ на: комментарий от anonymous

если от настоящей пустой, что мешает прочитать файл в строку и искать хеш от неё?

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.