LINUX.ORG.RU

Участвуйте в конкурсе глупых и страшных ошибок на языке C++

 , , ,


1

4

Команда PVS-Studio проводит конкурс прикольных/глупых/страшных ошибок на языке C++ (можно и C). Наверняка на практике у вас было что-то эпичное и интересное. Приглашаю поделиться. Самые «лучшие» ошибки мы соберем в статью, при условии, что их наберётся достаточное количество. А чтобы было интереснее, опишите историю бага.

Узнать детали и поучаствовать здесь: https://pvs-studio.ru/ru/blog/contest/

Дата окончания: 30 декабря 2023 года.

P.S. Отберём 10 участников с самыми интересными случаями и отправим им в подарок – мою бумажную книгу «Вредные советы для C++ программистов». Это переработанный и расширенный вариант «60 антипаттернов для С++ программиста». Если хотите, поставлю подпись. Я же знаю, что здесь есть мои почитатели ;)

Вот топ ошибок, которые встретились на моем пути:

  1. Грязный Гарри (ГГ) сделал класс Currency внутри хранились long int value центов. Он сделал метод getCents() через остаток от деления и сделал его мутабельным! Если изначально сумма была отрицательной, то после вызова этого метода становилась положительной! Интересные спецэффект правда? Человеку повезло, что находился в восьми часовых поясах от меня - так бы дождался канделябром по голове.

  2. Тоже код от ГГ - Win32 API, сохранял указатель на элемент вектора и почему-то рассчитывал на определенный порядок прихода сообщений от ОС. После изменения вектора естественно приложение падало.

  3. С++ Builder проект - передача int32 в хранимую процедуру БД. В базу приходили корёженные значения. Оказалось в хранимке был SMALLINT - int16 для этого поля.

  4. Не баг, но поучительно. Меня в свое время покусал Александреску и я наметапрограммировал не приходя в сознание систему обработки лицензий. В бинарник шла только функциональность покрытая лицензией. Кода было немного и всё без комментариев. Вообщем пришел через полгода напарник и сказал, что не осилил мой код. Я потом сам не осилил :) - только на следующий день восстановил в памяти, что там и как. По итогу переписали это все так, чтобы обычный миддл мог менять код. С тех пор стараюсь не переусложнять, а писать попроще.

necromant ★★
()
Последнее исправление: necromant (всего исправлений: 1)

и отправим им в подарок – мою бумажную книгу «Вредные советы для C++ программистов».

вот это мастхэв, атлас ссср и мира ~88 года в туалете зачитан до дыр, но не порван )

x905 ★★★★★
()

Отберём 10 участников с самыми интересными случаями

и отправим им в подарок – мою бумажную книгу «Вредные советы для C++ программистов»

Как мило. Одному мне очевидно из каких именно меркантильных интересов вы это делаете?

bugfixer ★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Самая страшная ошибка - на нем писать.

Хорошо. Зайдем с другой стороны, а какой язык подходит для написания linux ядра, systemd, графических тулкитов GTK, Qt, внутренностей Java/Python/Ruby и прочего системного софта?

Rust, но его на момент начала разработки перечисленного софта не было даже в зародыше.

В здравом уме никто не будет эти проекты переписывать целиком на другой %суперпупервагязыкпрограммирования%. К вашей радости или сожалению.

Повторю вопрос. На ваш взгляд, на каком языке нужно разрабатывать и поддерживать уже написанные приложения?

anonymous
()
// Было
spinlock_guard(_lock);

// Подразумевалось
spinlock_guard g(_lock);

Падало красиво. Понятно, что почему-то не сработал лок, и полезли из двух потоков одновременно, но почему лок не сработал - вот же он, есть…

blex ★★
()
20 марта 2024 г.
Ответ на: комментарий от former_anonymous
#include <new>
#include <iostream>

union A
{ 
    struct
    {
        unsigned char b1 : 1;
        unsigned char b2 : 1;
    } _flags;
    unsigned char _{};
};

int main()
{
    A a;
    std::cout << int(a._flags.b2);
    a._flags.b2 = 1;
    std::cout << int(a._flags.b2);
    new (&a) A;
    std::cout << int(a._flags.b2);
}

gcc 13.2 вывод:

010

gcc 4.8.5 вывод:

011
blex ★★
()