Как стать автором
Обновить

Комментарии 24

Проверка указателя на ноль после использования оператора new бессмысленна. При невозможности выделить память, оператор new генерирует исключение std::bad_alloc(), а не возвращает nullptr.
Это описание конкретно этой ситуации или в целом?
rcPolyMesh** pmmerge =
     new (std::nothrow) rcPolyMesh*[TILES_PER_MAP * TILES_PER_MAP];

Обработается корректно?
Анализатор знает и учитывает это. Цитата из документации V668:

Примечание N1. Анализатор не будет выдавать предупреждение, если используется placement new или «new (std::nothrow) T». Пример такого кода:

T * p = new (std::nothrow) T; // OK
if (!p) {
  // An error has occurred.
  // No storage has been allocated and no object constructed.
  ...
}
Прикольно, спасибо!
А вы уверены, что вот эта ваша рекомендация:

if ((uint32 roll = urand(0, 99)) < 3)

Вообще скомпилируется?
Спасибо, поправил. Кстати, в C++17 можно написать так:
if (uint32 roll = urand(0, 99); roll < 3)
Зачем вообще так писать? Какие преимущества у этого кода по сравнению с присваиванием в отдельной строке?
(кроме «Так тоже можно»?)
Мне вы зачем этот вопрос задаете? Такой вариант первоначально был приведен автором статьи как рецепт для «улучшения кода». Только этот рецепт оказался недействительным, т.к. он не компилируется.

Если же вас интересует, почему в C++ вообще можно объявлять локальные переменные внутри условия if-а, то это сделано для удобства. Объявленная в if-е переменная будет видна только в ветках then и else. Т.е. для вот такого кода:
int a = 0;
if(int b=(a+1)) {
  ...
}
else {
  ...
}

полным аналогом будет вот такой код:
int a = 0;
{
  int b = a+1;
  if(b) {
    ...
  }
  else {
    ...
  }
}

про эти лишние фигурные скобочки забывают, невольно продляя время жизни и область видимости для b. Что может быть чревато, если у b тип не такой простой, как int, а с нетривиальным деструктором.
область видимости переменной будет ограничена условным блоком.
Довольно слабое преимущество по сравнению с возможностью ошибиться с приоритетами.
с одной стороны, таким трюком в отсутствие с++17 можно очень изящно пользоваться если функции возвращают коды ошибок:
например, так
enum Result {
    Success = 0,
    Error1,
    Error2
    //...
};

Result job() {
    if (Result res = task1())
        return res;
    if (Result res = task2())
        return res;
    //...
    return Success;
}


С другой, действительно, выразительность этой конструкции оставляет желать лучшего. Ей не просто так не пользуются и придумали замену в виде if (init; cond)
if (Player::TeamForRace(target->getRace()) == ALLIANCE)
        modelid = 2428; // <=
      else
        modelid = 2428; // <=

В контексте не совсем и ошибка, водная форма друида в старых версиях одинаковая для орды и альянса, так что если и чинить то удалением проверки на «сторону».
В разделе «Избыточное условие» всё, конечно, зависит от того, есть ли побочные эффекты у кода, который скрывается под многоточием.
Под многоточием скрывается вот это:
if ((realtimeonly && (item->GetProto()->ExtraFlags & ITEM_EXTRA_REAL_TIME_DURATION)) || !realtimeonly)

Прототип функции GetProto():
ItemPrototype const* Item::GetProto() const;

Анализатор не выдал бы предупреждение в случае, когда код обозначенный многоточием влиял бы на переменную realtimeonly.
Ох, cmangos жив :) Странно, что выбор пал на него.
Я уж думал только TrinityCore активно дальше развивается (и надо бы перепроверить проблемные куски выше в TC).
А проверка этого кода легальная? :)
А что нелегального в проверке любого кода любыми методами, выложенного в открытый доступ? Есть ли вообще open source лицензии, которые запрещают чтение и анализ кода?
Так это же не официальный сервер WoW, или я ошибаюсь?
А разница? Проект open source, выложен на github. Речь же не о запуске своего шарда, а об анализе кода. Лицензия, под которой код опубликован, не запрещает этого.
Не неофициальный сервер WoW, а «любительская реализация серверной части одной из лучших MMORPG».
Нелегально запускать свой публичный сервер.
А этот код написан фанатами и распространяется по GNU GPL (т.е. автор передает творение в общественную собственность).
Причём на сайте указано что поднятие сервера незаконно и комманда mangos не оказывает никакой поддержки в этом.
Стараюсь не читать ваши статьи, но не потому, что плохие! Нет, напротив — потому что программа у вас умная, и находит такое, что волосы шевелятся. Порой прочитаю статью, а потом думаю по пути на работу: «Как оно вообще может работать? Как оно работает-то вообще с такой ошибкой?»

Ваша программа на меня оказывает экзистенциальное давление. Вот живёшь себе в мире, в котором программы пишут профессионалы, работают они так, как задумано, и всё хорошо. Потом бах! Что это? Как оно вообще может месяцами работать и не падать? Как оно вообще запускается? Это что получается, я тоже такое дерьмо пишу?

Вот с такими мыслями и еду на работу — писать код.

Спасибо большое! :D
Тоже удивлен проверкой данного проекта. Видать кто-то фанат :)
Очень полезная статья

Спасибо, очень интересная статья! Желаю вам финансовых успехов! Небольшой вопрос не по теме: а подписку на тулзу не продаёте? Ведь сами же говорили, что проверять проект надо регулярно.

Так можно сказать мы и продаем подписку. Просто минимальная единица времени — 1 год.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий