Comments 46
Как, ну КААК иначе такие дефайны появляются, блин?
function if (x) {return true;}
Здесь после if неразрывный пробел , который будет считаться частью идентификатора, плюс любовь js к автоматической расстановке точек с запятой, что позволяет этому работать.
Конечно, не так злобно, как в примере в статье, зато если хочется нагадить — можно применять избирательно, только по особо сложным местам.
Ошибку с sprintf, я думаю, он тоже покажет. Да даже если не покажет, то тут уж надо разуть глаза и посмотреть на код в IDE. Макросы подсвечиваются другим цветом, нежели функции. Ну, а если ты сделал одним цветом, то, как обычно, ССЗБ.
Естественно тюнинг флагов компилятора под проект (чтобы не втыкать -Weverything) — это отдельная задача.
Объявление и вызов соответственно:
static void CreateProjectSet(… int32 OutCreatedProjects, int32 OutMatchedProjects);
GameProjectAutomationUtils::CreateProjectSet(… OutMatchedProjectsMob, OutCreatedProjectsMob);
mlx5_cmd_exec(dev, &din, sizeof(din), &out, sizeof(dout));
компилируется без ошибки?
В коде, который на пятом месте, IDE должна была подсветить неиспользуемую переменную. И банальный линтер в pre-commit hook выловил бы такое. Хорошо хоть, что разработчики решили использовать статический анализатор (как я понимаю, постфактум, то есть, на коде из репозитория).
И после этого кто-то говорит о том, что Rust не нужен… 8 из 10 таких ошибок в Rust просто не скомпилируются.
Не согласен по поводу CryEngine.
for(pmd0=m_pMeshUpdate; pmd0->next; pmd0=pmd0->next);
pmd0->next = pmd;
Очевидно тут ищется конец списка и вставляется новый элемент в конец. В противном случае получится бесконечный цикл, поскольку после первого прохода pmd0 = pmd0->next <=> pmd0 = pmd
, затем второй проход в теле цикла pmd0->next = pmd <=> pmd->next = pmd
, привет infinite loop.
Так что это баг автоматического форматирования, а не программиста.
sprintf — это макрос, который раскрывается в (!) std::printf!
Вот пишут, что, как и раньше,
int sprintf ( char * str, const char * format,… );
Иначе весь «legacy»-код можно выбросить на помойку. Разве нет?
Приведённого куска кода явно недостаточно, чтобы сделать правильный вывод…
т.к. подобная оптимизация не влияет на поведение программы с точки зрения C/C++
Да ну, не может быть. Откуда компилятору знать, что memset не имеет побочных эффектов? Это можно понять только в рантайме. А если memset'у скормить адрес переменной из стека, а размер указать побольше, что бы записалась и следующая? А её уже использовать в коде? Понятно, что это страшный костыль, и того кто так делает к клавиатуре вообще подпускать нельзя, но тем не менее, так сделать можно. И компилятор не имеет права предполагать отстутствие побочных эффектов.
Пардон, но:
#define sprintf std::printf
это в чьём коде? Без этих данных решить задачу нет возможности. Тем более, что в Gcc актуальных версий такого определения в cstdio нет, там сделано так:
#undef sprintf
namespace std
{
using ::sprintf;
}
Toп 10 ошибок в C++ проектах за 2017 год