LINUX.ORG.RU

Сделаться программером.

Kroz ★★★★★ ()

Целочисленное переполнение.

xaizek ★★★★★ ()

вызвать чисто виртуальную функцию

вызвать чисто виртуальную функцию из конструктора.

ox55ff ()
Ответ на: комментарий от ox55ff

А современные компилеры разве позволяют другое?)

Meyer ★★★ ()

Ну и классика жанра - указатели.

Зато они простые и логичные. Пользоваться ими одно удовольствие.

ZweiStein ()

Самые эпичные выстрелы в ногу - когда компилятор косячит. Например, берёт и мувит объект при возвращении его, скажем, из вектора (а-ля return values[i]). Потому что может!

yoghurt ★★★★★ ()
Последнее исправление: yoghurt (всего исправлений: 1)
Ответ на: комментарий от Meyer

Проверил. На вызов чисто виртуальной функции ругается ошибкой. Однако, вызов виртуальной функции собирается нормально. Вот тут то и можно огрести проблем.

ox55ff ()
Ответ на: комментарий от yoghurt

Ужасы нашего городка. Обмазать всё const квалификаторами.

ox55ff ()
Ответ на: комментарий от ox55ff

Вот тут то и можно огрести проблем.

Осталось придумать, как инстанциировать объект с pure virtual.

devzero ()

Скастовать double во float, а потом сравнивать с очень большим int.

anonymous ()

Писать на СПП вместо Раста

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

Я уже не про pure, а про просто виртуальную функцию. Типо так

class A
{
public:
    virtual void foo()
    {
        std::cout << "hello A" << std::endl;
    }

    A()
    {
        foo();
    }
};

class B : public A
{
public:
    void foo() override
    {
        std::cout << "hello B" << std::endl;
    }
    
    B()
    : A()
    {}
};

int main()
{
    B *b = new B();
}

ox55ff ()

Ну и классика жанра - указатели.

Пустить тебя в репозиторий.

Bfgeshka ★★★★★ ()

Забыть скобки вокруг аргумента макроса.

Недавно стрельнул:

#define U64NAN_FROM(x) (((x) >= 0 && (x) <= U64NAN_MAX) ? ((u64nan_t) x) : U64NAN_NAN)
Кто бы заметил ошибку, если не знал, что она тут есть?

devzero ()

Компилить код под bare metal, попутно писать свой libc,гарантирую разрыв жопы на мелкие части.

AUX ()

1.0f/0
NaN может попасть вглубь программы и начнётся виселье, которое может всплыть очень нескоро

mittorn ★★★★★ ()
Ответ на: комментарий от devzero
$ clang-tidy-7 -checks=bugprone-macro-parentheses ../q.cc
1 warning generated.
/tmp/2/q.cc:8:71: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
#define U64NAN_FROM(x) (((x) >= 0 && (x) <= U64NAN_MAX) ? ((u64nan_t) x) : U64NAN_NAN)
                                                                      ^~
                                                                      ()
i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Интересно, а ПивасСтудия смогёт найти ошибку?

ox55ff ()
Ответ на: комментарий от ox55ff

Однако, вызов виртуальной функции собирается нормально. Вот тут то и можно огрести проблем.

R U KIDDING? Это ж чистой воды интерфейс, а чисто виртуальные функции и объявляются, чтобы их вызывать.

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

clang-tidy — не компилятор, это отдельный инструмент.

i-rinat ★★★★★ ()

Пропатчить код в рантайме и забыть flush-нуть кэш.

a1batross ★★★★★ ()

Передача ссылки на стек и выход из функции.

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

Тогда уж - программеру пойти в начальники.

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

Есть ли пример реального кода с такой проблемой?

anatoly ()

Ну и классика жанра - указатели.

Что «указатели»?

anatoly ()

несоблюдение неявных интерфейсов типов

dllmain ()
Ответ на: комментарий от i-rinat

Невнимательно прочитал имя команды.

Вот так и код я читаю задницей. %)

devzero ()
Ответ на: комментарий от anatoly

У меня-то есть, иначе я бы про него не узнал, да вот пошарить никак не могу - не положено-с :]

yoghurt ★★★★★ ()

Линковать объектники от разных компиляторов

Crocodoom ()

Использовать указатель на временный объект. Вся гадость в том что это скорее всего будет работать и отлавливается случайно.

wolph ★★ ()

Сейчас набежит толпа неосиляторов и будет говорить, что злой оптимизатор со злости портит их правильный код с UB.

Меня, пожалуй, больше всего раздражает the most vexing parse — даже не смотря на то, что я знаю про это правило, периодически оно меня ловит. Но это хороший выстрел в ногу, т.к. он виден в момент компиляции.

Туда же относится пихание typename/template во все места. Даже есть код, который по-разному ведёт себя в зависимости от наличия template:

#include <iostream>

template<typename T>
struct A {
  typedef int R();

  template<typename U>
  static U *f(int) { 
    return 0; 
  }

  static int f() { 
    return 0;
  }
};

template<typename T>
bool g() { A<T> a; return !(typename A<T>::R*)a.         f<int()>(0); }
template<typename T>
bool h() { A<T> a; return !(typename A<T>::R*)a.template f<int()>(0); }

int main() {
  std::cout << g<void>() << f<void>() << std::endl;
}

Ещё раздражает то, что в range for временные объекты из выражения, по которому итерируемся, умирают не после окончания итерации, а сразу. Но это тоже хороший выстрел в ногу, т.к. он виден в момент первого прогона под asan.

vzzo ★★★ ()

Создать Pod struct, не инициализировать и использовать в условных выражениях. Кидать исключение в деструкторе.

IceRain ()
Ответ на: комментарий от tailgunner

Передача ссылки на стек и выход из функции.

Интересненько :) А можно пример такого кода?

anonymous ()
Ответ на: комментарий от IceRain

Еще любимый выстрел в ногу - захват в лямбде по ссылке и вызов лямбды после уничтожения захватываемых данных.

IceRain ()

непременно пиши свои имплементации всего — строк, «умных» указателей, выделителей памяти, произвольно комбинируй вызовы malloc/new, пиши переопределения с максимально неожиданным поведением для стандартных операторов, определяй операторы над смайликами вида:


 o_o / o_o / o_o

slackwarrior ★★★★★ ()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от anonymous

Примера нет, на словах - локальная переменная передавалась в в конструктор нити по ссылке. В зависимости от фазы луны, конструктор либо успевал отработать до возврата из функции, либо нет.

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

Это слишком очевидно. И компилятор на это ругается, ЕМНИП.

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

Выстрел тут скорее в C-style cast, нежели в разнице между a.f и a.template f (которая, видимо, им же брутально и стирается).

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

Это боль. Порой объектники не чистятся, приходится вручную вычищать.

IceRain ()

обращайся к неконсистентным итераторам, имплементируй «вектор» на основе std::list :)

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

имплементируй «вектор» на основе std::list

Так реально делают??

IceRain ()

скрывай эксепшоны в (...), перехватывай падения в корку кастомными обработчиками сигналов и структурных исключений... и пытайся продолжать жызу приложения любой ценой после сегфолтов :)

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

У листа есть прекрасная особенность, ради которой порой стоит «имплементировать» вектор над ним.

yoghurt ★★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)