metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-09-17 10:13 am

За что мне это?

Бездны крестиков
boost_1_49_0\libs\filesystem\v3\src\operations.cpp
https://gist.github.com/3735989

После рекурсивного вызова не проверяется ec, соответственно, если он сломается - ошибка будет возвращена от попытки create_directory, а не настоящая ошибка от рекурсивного вызова.
Надо бы поискать в баг-трекере или отрепортить это дело.
PS: В 1.51.0 баг починен.

[identity profile] dair-spb.livejournal.com 2012-09-17 07:15 am (UTC)(link)
Я уже после названия первой директории бы дальше не ходил.

[identity profile] nivanych.livejournal.com 2012-09-17 07:31 am (UTC)(link)
> Бездны крестиков

Бездны крестиковой оккупации!

[identity profile] levgem.livejournal.com 2012-09-17 08:49 am (UTC)(link)
какой-то кошмар. Это тоже С++?

[identity profile] metaclass.livejournal.com 2012-09-17 09:16 am (UTC)(link)
Да, популярная С++ библиотека :)

[identity profile] nivanych.livejournal.com 2012-09-17 09:24 am (UTC)(link)
;-) Ну не эрланг же!

[identity profile] nivanych.livejournal.com 2012-09-17 09:25 am (UTC)(link)
Надо уметь превозмогать свой страх и отвращение!
Если есть хоть какое-то обоснование, зачем, конечно ;-)

[identity profile] trueblacker.livejournal.com 2012-09-17 10:38 am (UTC)(link)
нда :(
а ещё boost называется!
впрочем, версия уже не свежая

[identity profile] metaclass.livejournal.com 2012-09-17 10:52 am (UTC)(link)
В 1.51.0 все починено, судя по виду.

[identity profile] vaddimka.livejournal.com 2012-09-17 12:32 pm (UTC)(link)
меня как-то достала постоянная модификация интерфейса этой конкретной библиотеки и я ее практически отовсюду выпилил
а так, вообще, сам буст - очень даже гут
но вот если ковырнуть что-то типа asio, там граблей просто тонны

[identity profile] zamotivator.livejournal.com 2012-09-17 01:06 pm (UTC)(link)
Что значит "не проверяется"? Там есть is_directory - вот если этот метод сломается, ты получишь ошибку сразу.

[identity profile] zamotivator.livejournal.com 2012-09-17 01:06 pm (UTC)(link)
Забавно, что никто из комментаторов этого не заметил.

[identity profile] metaclass.livejournal.com 2012-09-17 01:14 pm (UTC)(link)
Что я получу после ошибки в рекурсивном вызове?
Конкретно сейчас я получаю вместо ERROR_ACCESS_DENIED - ERROR_PATH_NOT_FOUND, потому что рекурсивный вызов валится с первой ошибкой, ничего не проверяется и выполняется попытка вызвать create_directory, после чего возвращается уже другая ошибка.

И таки в 1.51.0 это переделано корректно.

[identity profile] zamotivator.livejournal.com 2012-09-17 01:16 pm (UTC)(link)
 if (p.empty() || exists(p))
    {
      if (!p.empty() && !is_directory(p))

Это что? Это не отваливается? Почему?
Путь должен быть exists и каждый его элемент должен быть директорией. Вот эта штука и свалится.

[identity profile] metaclass.livejournal.com 2012-09-17 01:18 pm (UTC)(link)
Я про:
// First create branch, by calling ourself recursively
create_directories(p.parent_path(), ec);
// Now that parent's path exists, create the directory
create_directory(p, ec);


тут пропущено что-то вроде if(ec) return false;
но в новой версии они более сложным образом сделали, используя локальный error_code
Edited 2012-09-17 13:19 (UTC)

[identity profile] zamotivator.livejournal.com 2012-09-17 01:19 pm (UTC)(link)
Тьфу, теперь понял.

Да, это баг, следует починить.

[identity profile] zamotivator.livejournal.com 2012-09-17 01:20 pm (UTC)(link)
А, т.е. в новой версии починено. Тем лучше :)

[identity profile] guamoka.livejournal.com 2012-09-17 09:58 pm (UTC)(link)
Э-э. Это такая крестики-спесифик бага? :-)