- 1
- 2
- 3
// Конкурс для C++ программистов от команды PVS-Studio
// Уникальная возможность получить приз за говнокод с багом!
// https://habr.com/ru/companies/pvs-studio/articles/775388/
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
// Конкурс для C++ программистов от команды PVS-Studio
// Уникальная возможность получить приз за говнокод с багом!
// https://habr.com/ru/companies/pvs-studio/articles/775388/
Поделитесь своим кодом с ошибкой и участвуйте в розыгрыше 10 книг "Вредные советы для C++ программистов". Подробности в публикации на Хабре: Конкурс для C++ программистов и их любимых багов - https://habr.com/ru/companies/pvs-studio/articles/775388/
0
bool isDate(int d, int m, int y)
{
return m > 0 && m < 13 ? d > 0 && d < 29 + (m - 2 ? 2 + (m + m / 8) % 2 : !(y % 4) && (y % 100) || !(y % 400)) : 0;
}
+1
void text::draw()
{
CmdWinGUI::draw();
COORD temp = startCo; //Разный мусор
COORD tempEnd = startCo;
int16_t _al = 0;
int16_t _an = 0;
int16_t remain = 0;
uint8_t a = 0;
bool fullRow = 1; //Флаги, не изменять
bool alignPrepare = 0;
if (tableLine)
{
temp.Y = temp.Y + lineShift + sepShift;
}
if (!tableFormat)
{
if (alignSetting == ALIGN_C)
{
_al = sizeCo.X/2;
for (uint8_t a = 0;a < 0xFF;++a) //Измеряем длину текстового поля
{
if (textBuffer[a] == NULL)
break;
++remain;
}
temp.X=startCo.X+ _al-remain/2; //Корректируем курсор в соответствии с расчётами
if (temp.X < startCo.X) //Если предыдущие вычисления дали ошибку - выход за предел рамки слева
temp.X = startCo.X; //Корректируем
}
for (;;)
{
SetConsoleCursorPosition(hCon, temp);
if (textBuffer[a] == NULL)
break;
printf("%c", textBuffer[a]);
++temp.X;
++a;
if (temp.X == startCo.X + sizeCo.X - 1) //Проверяем достигло ли рамки, иначе обрываем цикл
break;
}
return;
}
for (uint8_t b = 0;b<=filledRows;++b)
{
if (!fullRow)
{
temp.X = tempEnd.X;
}
tempEnd.X += tableRowSize[b] - 1;
if (alignSetting == ALIGN_C)
{
--temp.X;
//Предварительные расчеты смещения
if (!alignPrepare)
{
for (SHORT a = temp.X;a < 0xFF;++a)
{
if (a == tempEnd.X) //Проверяем достигло ли рамки, иначе обрываем цикл
{
--_an;
break; //половина длины поля таблицы
}
++_an;
}
for (uint8_t a = 0;a < 0xFF;++a)
{
if (tableText[b][a] == NULL)
{
_al = a; //половина длины слова
break;
}
}
alignPrepare = 1; //Подымаем флаг готовности
}
//Коррекция положения курсора в соответствии с результатами блока предварительных расчётов
temp.X += abs(_an / 2) - abs(_al / 2);
_an = 0;
}for (;;){
SetConsoleCursorPosition(hCon, temp); //Ставим курсор в начало/середину/конец поля
if (tableText[b][a] == NULL)
{
fullRow = 0; //При окончании поля текста до заполнения поля снимаем флаг заполнения поля
break;
}
++temp.X;
if (temp.X == tempEnd.X) //Проверяем достигло ли рамки, иначе обрываем цикл
{
fullRow = 1; //При окончании поля в таблице до завершения поля текста прекращаем вывод и выходим из цикла
break;
}
printf("%c", tableText[b][a]);
++a;
}
a = 0;
alignPrepare = 0; //Сбрасываем флаг для следующей итерации
}
if (isChanged)
this->editFlagSwitch();
}
Рендер текста с учётом коллизии слева и справа
+1
#include "Windows.h"
void line::draw()
{
CmdWinGUI::draw();
uint8_t modB = 0; //modeByte
COORD tempSt = lineStart;
COORD tempEn = lineEnd;
SHORT dX = abs(lineEnd.X - lineStart.X);
SHORT dY = abs(lineEnd.Y - lineStart.Y);
SHORT sX = lineStart.X < lineEnd.X ? 1 : -1;
SHORT sY = lineStart.Y < lineEnd.Y ? 1 : -1;
SHORT dErr = dX - dY;
SHORT dErr2 = 0;
if (scan)
{
SetConsoleCursorPosition(hCon, lineStart);
for (uint8_t a = 0;a <= lineEnd.X-lineStart.X;++a)
{
modB = lineAtrBuffer[a];
SetConsoleTextAttribute(hCon, modB);
printf("%c", lineSymBuffer[a]);
}
if (isChanged)
this->editFlagSwitch();
return;
}
for (;;)
{
SetConsoleCursorPosition(hCon, tempSt);
printf("%c", lineSym);
if (tempSt.X == tempEn.X&&tempSt.Y == tempEn.Y)
break;
dErr2 = dErr * 2;
if (dErr2 > -dY)
{
dErr -= dY;
tempSt.X += sX;
}
if (dErr2 < dX)
{
dErr += dX;
tempSt.Y += sY;
}
}
if (isChanged)
this->editFlagSwitch();
}
Отрисовка произвольной графической линии в консоли
0
char *SomeGlobalPointer {};
void foo()
{
SomeGlobalPointer = new char[1024];
}
int main()
{
foo();
if (!SomeGlobalPointer)
{
delete[] SomeGlobalPointer;
}
return 0;
}
Отсюдова:
https://pvs-studio.ru/ru/blog/posts/cpp/1068/
0
auto objs = it.get_objects();
switch(objs.size())
{
case 1: sent = _out_stream.send_message(objs[0]);
break;
case 2: sent = _out_stream.send_message(objs[0], objs[1]);
break;
case 3: sent = _out_stream.send_message(objs[0], objs[1], objs[2]);
break;
case 4: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3]);
break;
case 5: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4]);
break;
case 6: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5]);
break;
case 7: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6]);
break;
case 8: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7]);
break;
case 9: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8]);
break;
case 10: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9]);
break;
case 11: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10]);
break;
case 12: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11]);
break;
case 13: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11],
objs[12]);
break;
case 14: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11],
objs[12], objs[13]);
break;
case 15: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11],
objs[12], objs[13], objs[14]);
break;
case 16: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11],
objs[12], objs[13], objs[14], objs[15]);
break;
case 17: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11],
objs[12], objs[13], objs[14], objs[15], objs[16]);
break;
case 18: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11],
objs[12], objs[13], objs[14], objs[15], objs[16], objs[17]);
break;
case 19: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11],
objs[12], objs[13], objs[14], objs[15], objs[16], objs[17],
objs[18]);
break;
case 20: sent = _out_stream.send_message(objs[0], objs[1], objs[2], objs[3], objs[4], objs[5],
objs[6], objs[7], objs[8], objs[9], objs[10], objs[11],
objs[12], objs[13], objs[14], objs[15], objs[16], objs[17],
objs[18], objs[19]);
break;
default:
fprintf(stderr, "error: Too much attached objects (%lu), talk to developer\n", objs.size());
return false;
}
if (!sent)
{
fprintf(stderr, "error: Unable to send message to output pipe\n");
return false;
}
Меня заставили это сделать, потому что по задумке число вложенных объектов известно на этапе разработки, а у меня - нет.
0
const uint8_t DexFile::kDexMagic[] = { 'd', 'e', 'x', '\n' };
const uint8_t DexFile::kDexMagicVersions[DexFile::kNumDexVersions][DexFile::kDexVersionLen] = {
{'0', '3', '5', '\0'},
// Dex version 036 skipped because of an old dalvik bug on some versions of android where dex
// files with that version number would erroneously be accepted and run.
{'0', '3', '7', '\0'}
};
Отсюдова:
https://android.googlesource.com/platform/art/+/refs/heads/nougat-release/runtime/dex_file.cc
+1
// Всем привет. Я тоже принёс говнокода, но в необычном формате.
// А именно, я написал мини-книгу "60 антипаттернов для С++ программиста".
// https://pvs-studio.ru/ru/blog/posts/cpp/1053/
Там вы найдёте и реальный C++ говнокод и просто вредные советы в духе "Пишите код так, как будто его будет читать председатель жюри IOCCC и он знает, где вы живёте (чтоб приехать и вручить вам приз)".
Если сразу не понятно почему "совет" вреден, то там есть соответствующий разбор.
Готов подискутировать про написанное. Ну и приглашаю накидывать в комментариях аналогичные советы.
P.S. Предупреждаю: там много букв. Сразу запасайтесь кофе/энергетиком. Или попкорном :)
0
/*
GNOT General Public License!
(c) 1995-2011 Microsoft Corporation
*/
#include "dos.h"
#include "win95.h"
#include "win98.h"
#include "sco_unix.h"
#include "metro.h" //windows 8
class Windows8 extends WindowsSeven implements Nothing {
int totalNewFeatures = 6; //task manager, ribbon, new bsod =D, new WAT, metro, linux_block
int totalWorkingFeatures = 1; //bsod
float bugCount = 345889E+09;
bool readyForRelease = FALSE;
void main() {
while (!CRASHED) {
if (first_time_install) {
if (installedRAM < 2GB || processorSpeed < 4GHz || videoCard < 1) { //requires video card
MessageBox("Hardware incompatibility error.");
GetKeyPress();
//BSOD();
BSOD2(); //windows 8
}
}
Make10GBswapfile();
SearchAndDestroy(FIREFOX|OPENOFFICEORG|ANYTHING_GOOGLE|LINUX_PARTITION|GRUB); //new features (linux & grub)
AddRandomDriver();
MessageBox("Driver incompatibility error.";
GetKeyPress();
//BSOD();
BSDO2(); //windows 8
}
//printf("Welcome to Windows 2000");
//printf("Welcome to Windows XP");
//printf("Welcome to Windows Vista");
//printf("Welcome to Windows 7");
printf("Welcome to Windows 8"); //8 : official name?
goto check_license;
goto start_metro; //windows 8 exclusive!! remove it on future versions
start_metro:
StartMetroUI();
if (WindowsStartMenuClick == 1)
{
goto start_metro;
}
else
{
if (TryingToRemoveMetroUsingRegedit == 1)
{
goto start_metro;
}
}
if (still_not_crashed) {
//CheckUserLicense();
//DoubleCheckUserLicense();
//TripleCheckUserLicense();
goto check_license;
check_license:
#ifdef NEED_LICENSE //DO_NOT_REMOVE, ALWAYS NEED A LICENSE
#include "string.h"
#endif
if (strlen(LicenseInput) < 10 || CheckOEMLicense(LicenseInput) < 1)
{
MessageBox("License is already in use or invalid.");
GetKeyPress();
//BSOD();
BSOD2(); //windows 8
}
else
{
goto start_metro;
}
RelayUserDeatilsToRedmond();
DisplayFancyGraphics();
FlickerLED(hard_drive);
//SetTheme(WindowsVista);
SetTheme(WindowsSeven);
RunWindowsSeven();
}
}
return LotsMoreMoney;
}
0
// Решает задачу из огэ по информатике
// Первое число - количество
// затем числа идут
// выводит наибольшее число которое оканчивается на 3
#include <vector>
#include <stdio.h>
typedef unsigned char zero;
typedef unsigned int cat;
cat rex = 0;
class orange
{
public:
cat *bananas = nullptr;
std::vector<zero> apples;
void a()
{
for (zero *ufo = apples.data(); ufo - apples.data() < apples.size();)
{
switch (*ufo++)
{
case 1: if (!bananas) bananas = new cat[*(cat *)ufo]; ufo += sizeof(int); break;
case 7: delete[] bananas; bananas = nullptr; break;
case 4: bananas[*(cat *)ufo] = bananas[*(cat *)(ufo + sizeof(int))]; ufo += 2 * sizeof(int); break;
case 0: bananas[*(cat *)ufo] = *(cat *)(ufo + sizeof(int)); ufo += 2 * sizeof(int); break;
case 8: bananas[*(cat *)ufo] = bananas[*(cat *)(ufo + sizeof(int)) + bananas[*(cat *)(ufo + sizeof(int) * 2)]]; ufo += 3 * sizeof(int); break;
case 9: printf("%d\n", bananas[*(cat *)ufo]); ufo += sizeof(int); break;
case 2: rex = bananas[*(cat *)ufo]; ufo += sizeof(int); break;
case 6: scanf("%ud", bananas + *(cat *)ufo); ufo += sizeof(int); break;
case 3:
{
if (bananas[*(cat *)ufo] > bananas[*(cat *)(ufo + sizeof(int))]) bananas[*(cat *)ufo] = bananas[*(cat *)ufo];
else bananas[*(cat *)ufo] = bananas[*(cat *)ufo + *(cat *)(ufo + sizeof(int))]; ufo += 2 * sizeof(int); break;
}
case 5: bananas[*(cat *)ufo] = bananas[*(cat *)ufo] % bananas[*(cat *)(ufo + sizeof(int))]; ufo += 2 * sizeof(int); break;
}
}
apples.clear();
}
void a(zero melon)
{
apples.push_back(melon);
}
};
int main()
{
orange *limon = new orange;
cat timings[] =
{
1, 16, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0,
0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0
};
cat peoples[] = { 1, 1, 0, 0, 0, 6, 0, 0, 0, 0, 2, 0, 0, 0, 0, 7 };
int backups[] = { 9, 0, 0, 0, 0 };
cat buldogs[] =
{
6, 2, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 2, 0, 0, 0, 4, 7, 0, 0, 0, 2, 0, 0, 0, 5, 2, 0, 0, 0, 1, 0, 0, 0,
8, 2, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, 0, 0, 0,
};
for (cat fruit = 0; fruit < 0xE + 0b10; ++fruit) {limon->a(peoples[fruit]);} limon->a();
for (cat juicegrinding = 0; juicegrinding < 33 + 0x50; juicegrinding++){limon->a(timings[juicegrinding]);}
for (cat fish = 0; fish < rex; fish += (100 ^ 0x64 + 0b11) - 0x2)
{
for (cat limons = 0; limons < 2 * 2 * 2 * 2 * 2 + 0b100000 - 1; ++limons){limon->a(buldogs[limons]);}
}
for (cat apples = 0; apples < 0x16 - 0b10000 - 1; apples++){limon->a(backups[apples]);} limon->a(); delete limon;
}
Чувак, позволь мне рассказать, я как волшебник C++, разворачивающий свои кодовые заклинания, словно колдун в цифровом мире. У меня этот язык в кармане, братан, словно дирижер, ведущий симфонию из единиц и нулей. Но не думай, что я буду тут прямо о своей крутости говорить, ой нет, я предпочитаю позволить моему коду говорить за меня.
Когда я погружаюсь в C++, это словно нырок в бесконечный океан возможностей. Я танцую с указателями, жонглирую ссылками и скачу на волнах управления памятью, словно настоящий мастер. Это дикая гонка, мой друг, но именно от этой адреналиновой суеты я получаю настоящий кайф.
Но знаешь, что по-настоящему круто? Сила абстракции, парень. Я обожаю создавать эти модульные, многоразовые блоки кода, называемые классами. Они как маленькие вселенные функциональности, которые я могу вызывать в любой момент. А шаблоны, о, братишка, шаблоны — это как швейцарские ножи C++. Они позволяют мне раскрыть всю мощь вычислений на этапе компиляции, словно безумный ученый, готовящий самые потрясающие зелья.
А теперь сделаем небольшой отступление. Вообрази, чувак, я вгружен в кодовые окопы, сражаясь с багами и отлавливая неэффективности. Это как бесконечный квест, борьба со временем и сложностью. Но, эй, у меня есть мой надежный напарник — стандартная библиотека C++. Она — мой арсенал контейнеров, алгоритмов и вспомогательных функций. С её помощью я могу нарезать и перемешивать данные, словно настоящий шеф-повар в цифровой кухне.
И не забывай про производительность, парень. Я стараюсь выжать каждую каплю мощи из своего кода. Я ныряю в низкоуровневые операции, знакомлюсь с железом. Вставки ассемблера — моё тайное оружие, способ связи с самим железом. Оптимизирую регистры, высвобождаю кэш и расширяю границы того, что возможно.