Комментарии 29
Ну судя по этому коду товарищ Игорь Лобанчиков в целом широко отметился в этом проекте. Но — не оценили его комрады…
Amazon Lumberyard разрабатывается как кроссплатформенный движок. Поэтому разработчики стараются поддерживать как можно больше компиляторов.
Я надеюсь, было понятно, что это не С или С++ компилятор, так что странно читать о кроссплатформенности. Тут речь идет о компилятореGLSL для шейдеров, код которых и формирует та самая функция.
Программа, которая например умеет работать с ATI и NVidia драйверами одновременно, вовсе не обязательно является кроссплатформенной.
#define CLEAR_HASH(s) \
s->head[s->hash_size-1] = NIL; \
zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
...
if (s->matches == 1)
slide_hash(s);
else
CLEAR_HASH(s);
Т.к. скобки угловые забыли поставить и в макросе, и в else, то внутрь попадает только первая строка макроса, а вторая исполняется независимо от условия s->matches == 1.
Случай там довольно редкий (поэтому оно и ехало незаметно до 2018 года), но отлаживать такое было бы весьма забавно, и когда тебе о таком вот сообщает программа — это приятно.
Должна быть другая диагностика — обнаружение минимально отличающихся именами переменных/типов/классов/enum…
Я про это писал в «Надежном программировании»
fgets возвращает строку с \n или возвращает null, если поток больше не содержит данных (в нашем случае stdin перенаправлен на файл), получается записывает в command_buf как минимум один символ (перевод строки). Т.е. strlen(command_buf) будет всегда >= 1, если fgets вернул не указатель на command_buf. Разве нет?
Но в примере, который демонстрируется на видео, вводится не пустая строка, а строка, которая начинается с символа '\0'. Можно подробнее почитать об этом по ссылке на оригинальную статью.
Ответил ниже, хабр для новых пользователей не даёт ответить после первого комментария почему-то, только новый комментарий оставить.
Похоже, код просто не предполагает то, что stdin перенаправлен на файл. А если поток перенаправлен и в нем в последней строке не окажется \n, то последний символ удалится — больше похоже на note, чем ошибку.
Это и удивило, что такой пустяк на 4й позиции ошибок оказался, хотя это и вовсе не ошибка, если код предназначен для работы исключительно из консоли и исключительно для ввода текстовых команд. Думаю, не стоит брать в счёт то, что интерпретатор cmd умеет такую дичь делать, как на видео. Если такое брать во внимание, то вообще fgets для stdin использовать нельзя окажется.
Полагаю, время писать статью "Как VasRedDoor и zhekov оказлись внимательнее PVS Studio и 3х с половиной человек".
Всем спасибо за ответы!
Только изменение контейнера при его обходе происходило не так явно, а на 5-6-м уровне глубины обработки… Мозг сломал, пока нашел бяку…
Ну и 10-е место надо держать в голове. Обычно я так не делаю (конструктор из конструктора), поэтому пока и не натыкался, но все-таки интересная ситуация…
А макросы, если сложнее одной строки, это зло.
На месте предыдущей строки кода Святослав обнаружил вот это:
(((targ)->sv_flags & 0x00000400) && (!((targ)->sv_flags & 0x00200000) || S_sv_only_taint_gmagic(targ)) ? (mg)->mg_len = ((prog->offs)[0].end), (mg)->mg_flags |= 0x40 : ((mg)->mg_len = (((targ)->sv_flags & 0x20000000) && !__builtin_expect(((((PL_curcop)->cop_hints + 0) & 0x00000008) ? (_Bool)1 :(_Bool)0),(0))) ? (ssize_t)Perl_utf8_length( (U8 *)(truebase), (U8 *)(truebase)+((prog->offs)[0].end)) : (ssize_t)((prog->offs)[0].end), (mg)->mg_flags &= ~0x40));
Выглядит как Перл… Батюшки, да это ж и есть Перл!
Спасибо за ответ.
std::vector<int> v;
v.resize(some_value);
Не может быть, чтобы константа CursorShowing равнялась 0, ведь буквально парой строк выше она инициализирована значением 1.
Вот тут, кстати, видна разница между отдельным инструментом статического анализа и статическим анализатором, встроенным в IDE. Ведь в IDE вы бы сразу в точке предупреждения нажали "перейти к определению символа" и обнаружили бы причину в ту же минуту. Не пришлось бы долго разбираться и даже создавать тикет в баг-трекере.
Если же действительно в анализаторе ошибка, будет легче понять, где она. Так как анализатор переиспользует ту же процедуру разрешения символа, что и функция перехода к объявлению, вы сразу поймёте, ошибка в анализе или в разрешении символов.
Топ 10 ошибок в C++ проектах за 2018 год