LINUX.ORG.RU

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

 ,


2

6

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

★★★★★

Почти все они связаны с эксепшонами, виртуальными фунциями и наследованием.

Kuzy ★★★
()

инициализировать переменную для дескриптора сокета нулём. А потом закрыть неоткрытый сокет :)

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

Эт на здоровье — только не надо называть его «вектор» :)

slackwarrior ★★★★★
()

невиртуальный деструктор с утечкой памяти

anonymous
()

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

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

Можно и pure virtual аналогично вызвать:

struct A
{
    A() { f(); }
    virtual void f() = 0;
};

void A::f()
{
    qDebug("pure virtual called");
}

Ower
()

Не различать типы и выражения (rvalue reference и rvalue).

anonymous
()

Создать shared_ptr через обычный указатель при уже существующем shared_ptr.

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

выходы за пределы выделенной памяти

Где это возможно? Уже давно для колхозников напилены безопасные абстракции.

неправильная синхронизация потоков

Ненужно в 95% случаев. В остальных <5% случаев аналогично первому.

переполнения стека.

Это вообще детский садик.

LjubaSherif
()

делитесь способами стрельбы себе в ногу (или сразу в голову)

Использовать alloca() и забыть, что выделяется на стеке со всеми вытекающими. Использовать realloc() и забыть что возвращаемый указатель не всегда на одну и туже память.
С *alloc / new в принципе куча способов стрельбы.

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

Использование C вместо современных плюсов. C-style касты и угребещные попытка симулировать наследование на С.

В понедельник нашел грубейшую ошибку в Apache Etch.

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

C-style касты

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

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

непременно пиши свои имплементации всего
«умных» указателей

Сталкивался и с таким в одном кроссплатформенном 2D движке. Там был свой наколеночный смартпоинтер, похожий на тот, что был в старом бусте, но сильно упрощенный. Самый цимес, что написан движок был на современных плюсах (14). Что мешало заюзать SP из STL - загадка.

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

Вот этот трэшак... Падает на последней строке тут.

void etchsession_get_objinfo (etch_objsession_objinfo* p, void* evt)
{
    memset(p, 0, sizeof(etch_objsession_objinfo));
    if (NULL == evt) return;
    p->obj = (etch_object*) evt;
    ((etch_object*)p)->obj_type = ((etch_object*) evt)->obj_type;
    ((etch_object*)p)->class_id = ((etch_object*) evt)->class_id;

    if (is_etch_unwantedmsg (p->obj))

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

Что мешало заюзать SP из STL - загадка.

В std::shared_ptr используются атомарные операции для инкремента/декремента ссылок. Если умный указатель должен использоваться только в рамках одного потока, то такое поведение имеет слишком большие накладные расходы. Поэтому люди и пишут аналоги своих shared_ptr без использования atomic-ов.

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

Портировали легаси?

Вряд ли. Дата первого релиза - начало 2013, а там уже C++11 во всю по планете шагал.

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

Поэтому люди и пишут аналоги своих shared_ptr без использования atomic-ов.

Добавлю, что довольно кривые аналоги.

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

да добро бы писали с пруфами «оверхеда» и т.п. обоснуем — а то без, и потом у них появляются рассыпаные по коду smart_ptr2, smart_ptr3... smart_ptrN естественно задокументированные примерно никак.

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

для колхозников

вы ответили на вопрос. я не пользуюсь абстракциями, у меня нет никаких проблем. и считаю, что эти абстракции - позорное пятно на языке программирования. но колхозников в программировании всё больше. и их никакие абстракции и подгузники не спасут.

Ненужно в 95% случаев

что ненужно? потоки? колхозникам - возможно. я же последний раз писала однопоточное приложение в школе. с тех пор проекты стали как-то посложнее :)

Это вообще детский садик.

любые ошибки - детский садик. это тема такая.

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

Вот этот трэшак...

Я что-то моск сломал - они тут случайно сами не запутались что есть p, а что p->obj? И да, каст какой-то ... диковатый.

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

Написать delete this; в конструкторе.

andreyu ★★★★★
()

Например, структура с битовыми полями в разных комиляторах может оказаться разной, даже с pragma pack.

anonymous
()

Господа, делитесь способами стрельбы себе в ногу (или сразу в голову).

Обработка длинных строк, оканчивающихся нулём - это самое «гениальное» изобретение сишников.

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

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

Никакого прострела в ногу тут нет. Вызывай на здоровье. (Только определить не забудь.)

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

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

Философия «огромных накладных расходов» (особенно там, где их нет) и экономия на спичках мешают быть продуктивным и успешным.

Поэтому люди и пишут аналоги своих shared_ptr без использования atomic-ов.

См. первый пункт.

azelipupenko
()

Ещё вспомнил из личного. Ядро - либа на Си, программа - GUI на Delphi. Совмещение двух и более языков (и как следствие переписывание хидеров на, в данном случае, pascal) - бесценный опыт стрельбы по конечностям и ходьбы по граблям.

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

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

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

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

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

Это всё понятно, что любая операция имеет цену. Только всё относительно. Моя мысль в том, что с подходом подсчёта циклов процессора на атомарный инкремент счётчика можно подорвать себе драгоценное здоровье, ничего ценного при этом не сделав. Оставь эти подсчёты Джосатиссам на конференциях в аудиториях. Используй shared_ptr и будь счастлив. (Что ты, наверное, и делаешь.)

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

Не говорите людям, что делать, и они не будут говорить вам куда пойти.

Человек выразил непонимание того, почему кому-то может потребоваться сделать аналог shared_ptr. Одна из причин (актуальных на данный момент и вроде как даже обсуждавшихся/обсуждающихся комитетом) озвучена. Нравится ли это кому-нибудь, считает ли кто-то это актуальной причиной — это уже дело десятое.

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

Занятие всей доступной памяти — это самое «гениальное» изобретение жаба-макак.

Пробой стека данных в стек выполнения строкой, оканчивающейся нулём, и способы ивращённого обхода этого несколькими способами, вплоть до аппаратного патчинга процессора (NX-bit) и всё равно не помогает!!!

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 2)
Ответ на: комментарий от eao197

Не говорите людям, что делать, и они не будут говорить вам куда пойти.

Но ведь такие как человек на видео как раз и говорят, что делать. Поэтому пусть идёт гуляет со своими подсчётами, не забивает ими мне голову. Дело то в том, что Америку он не открыл, и всем немного думающим и так ясно что к чему, и какая цена операции копирования в shared_ptr. Примерно так ясно.

Человек выразил непонимание того, почему кому-то может потребоваться сделать аналог shared_ptr.

Ну так это потому, что человек не хочет на данном этапе думать о таких мелочах. Человек думает, как ему взять кресты и сделать с их помощью что-то работающее. Зачем ему забивать голову ценой атомарных операций я не понимаю. Вот надо будет ему это реально понять (такая у него мега популярная и нужна система получится, что вот прям shared_ptr будет сильно не устраивать коммунити по причине тормозов), тогда он задумается, можешь даже не сомневаться.

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

Есть мнение, это из-за того, что в PDP-11 были операции для работы с такими строками. Но это не точно.

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

На JavaScript.

Шутку понял.

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

Конечно же на PHP. Это глобально и надёжно. И самое замечательное в том, что таким образом можно избежать контакта с программистами на C++.

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

И самое замечательное в том, что таким образом можно избежать контакта с программистами на C++.

И со всем остальным миром тоже ;)

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