LINUX.ORG.RU

Способы выстрелить себе в ногу

 ,


2

6

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

★★★★★

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

xaizek ★★★★★
()

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

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

ox55ff ★★★★★
()

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

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

Deleted
()
fclose(NULL);
Deleted
()

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

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

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

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

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

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

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

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

Deleted
()

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

anonymous
()

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

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

Я уже не про 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)
Кто бы заметил ошибку, если не знал, что она тут есть?

Deleted
()

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

AUX ★★★
()

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

mittorn ★★★★★
()
Ответ на: комментарий от Deleted
$ 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 ★★★★★
()

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

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

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

hobbit ★★★★★
()

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

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

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

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

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

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

yoghurt ★★★★★
()

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

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
()
Ответ на: комментарий от 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
()

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

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

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

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.