Комментарии 10
Хайку еще жива?
С солидным опозданием, но бета должна выйти весной-летом. Ритм у них упал, разработчики по контракту поразбегались, но надежда есть.
Обратный отсчет до вероятной бэты можно наблюдать здесь dev.haiku-os.org/milestone/R1/beta1 (44 открытых тикета осталось, если новые не добавят). А пока лучше ставить последние nightly-сборки, в которых есть все актуальные плюшки вроде пакетного менеджера (и баги, вестимо :))
Макросы и так доставляют неудобства при отладке, так ещё и являются источником вот таких ошибок: макрос 'DO_NUMBER' раскрывается в несколько строк, но только первая их них будет частью условного оператора, последующие же операторы будут выполняться независимо от условия.
Конкретно в этом коде else вообще не нужен, потому что перед этим был переход на обработку исключительной ситуации. Так что по факту код работает, как задумывалось :-)
Так-то да, но это скорее исключение/везение. Любой новый разработчик, который присоединится к проекту, может по-разному воспользоваться этим макросом, считая, что он задан по правилам: один макрос — один блок кода.
Это мне напомнило адский код в Eclipse SDK — MarkerSet#shareStrings (Java):
По факту код работает стабильно: строчка, которая падает с исключением при выполнении, никогда не выполняется из-за заведомо невыполнимого условия перед этим. Когда я вижу такое, начинаю крепко задумываться: писать багрепорт или не беспокоить людей по пустякам :-)
protected IMarkerSetElement[] elements;
public void shareStrings(StringPool set) {
//copy elements for thread safety
Object[] array = elements; // Тип массива заменили на более общий, но виртуальную машину не обманешь
if (array == null)
return;
for (int i = 0; i < array.length; i++) {
Object o = array[i];
if (o instanceof String) // Это сравнение заведомо ложно: в исходном массиве строк быть не могло
array[i] = set.add((String) o); // add возвращает String — пытаемся записать строку
// в массив IMarkerSetElement[], гарантированный ArrayStoreException в рантайме
if (o instanceof IStringPoolParticipant)
((IStringPoolParticipant) o).shareStrings(set);
}
}
По факту код работает стабильно: строчка, которая падает с исключением при выполнении, никогда не выполняется из-за заведомо невыполнимого условия перед этим. Когда я вижу такое, начинаю крепко задумываться: писать багрепорт или не беспокоить людей по пустякам :-)
Странно, что код не обёрнут в
do { } while(0)
, как обычно делают для многострочных макросов. Как раз от таких ошибок спасает.Мы вернулись :). Как выстрелить себе в ногу в C и C++. Сборник рецептов Haiku OS.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Проверка операционной системы Haiku (семейство BeOS) c помощью PVS-Studio. Часть 1