В проекте такая конструкция используется, чтобы сделать ранний выход из функции с одним, написав при этом лишь один return.
Еще такая конструкция может использоваться для объединения нескольких конструкций в одну в макросах.
Пояснение (TL;DR;)
#define FreeMemoryAndExit(p) free((p)); return
void foo()
{
int *ptr = malloc(....);
// Какая-то волшебная логика
// Что-то пошло не так
if (....)
FreeMemoryAndExit(ptr);
// Чудесный код продолжается
}
После макроподстановки получим следующий код:
#define FreeMemoryAndExit(p) free((p)); return
void foo()
{
int *ptr = malloc(....);
// Какая-то волшебная логика
// Что-то пошло не так
if (....)
free((ptr)); return;
// Чудесный код продолжается
}
В итоге чудесный код никогда не выполняется, return всегда безусловный. Теперь воспользуемся do { .... } while (false):
#define FreeMemoryAndExit(p) do { free((p)); return; } while (false)
void foo()
{
int *ptr = malloc(....);
// Какая-то волшебная логика
// Что-то пошло не так
if (....)
FreeMemoryAndExit(ptr);
// Чудесный код продолжается
}
И вот что получим после препроцессора:
#define FreeMemoryAndExit(p) do { free((p)); return; } while (false)
void foo()
{
int *ptr = malloc(....);
// Какая-то волшебная логика
// Что-то пошло не так
if (....)
do { free((ptr)); return; } while (false);
// Чудесный код продолжается
}
Теперь освобождение и выход зависят от условия. Чудесный код продолжается. Подобного можно было добиться и просто оборачиванием в фигурные скобки. Но у do { .... } while (false) и здесь есть преимущество - если кто-то допишет ветку else после макроса, то ничего не сломается.
Согласен с Вами, что в функцию free можно передавать нулевой указатель. Цитирую из статьи: "Заметим, что сам по себе вызов функции free на нулевом указателе не является ошибкой."
Предупреждение PVS-Studio V575 прежде всего про то, что в функцию freeстранно передавать нулевой указатель. Возможно, указатель занулили до вызова free и получили утечку памяти. Может быть, опечатались в названии переменной, и хотели освободить память по другому адресу.
Мы сейчас работаем над версией плагина для Qt Creator 9.0.x. Выдадим вам бету и скажем, что с ней делать, как будет готова.
На данный момент только для версии Qt Creator 8.0.x. А вы какую версию используете?
В проекте такая конструкция используется, чтобы сделать ранний выход из функции с одним, написав при этом лишь один return.
Еще такая конструкция может использоваться для объединения нескольких конструкций в одну в макросах.
Пояснение (TL;DR;)
После макроподстановки получим следующий код:
В итоге чудесный код никогда не выполняется, return всегда безусловный. Теперь воспользуемся
do { .... } while (false)
:И вот что получим после препроцессора:
Теперь освобождение и выход зависят от условия. Чудесный код продолжается. Подобного можно было добиться и просто оборачиванием в фигурные скобки. Но у
do { .... } while (false)
и здесь есть преимущество - если кто-то допишет ветку else после макроса, то ничего не сломается.Согласен, спасибо за ваш комментарий. Поправил код в статье.
Прямо сейчас - нет. Но может быть Inori доработает таки свой эмулятор. Шансы есть, подождём лет 5-10))
Согласен с Вами, что в функцию free можно передавать нулевой указатель. Цитирую из статьи: "Заметим, что сам по себе вызов функции free на нулевом указателе не является ошибкой."
Предупреждение PVS-Studio V575 прежде всего про то, что в функцию free странно передавать нулевой указатель. Возможно, указатель занулили до вызова free и получили утечку памяти. Может быть, опечатались в названии переменной, и хотели освободить память по другому адресу.
Спасибо за предложение, посмотрим.