| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Грабли, на которые мы наступаем |
| Автор: borisbn 6.2.2012, 20:44 | ||||||
Предлагаю собрать здесь ошибки, которые
Просьба: постить сюда ошибки, причину ошибки, и, самое главное, как уберечься от их совершения. Итак. 1)
2)
3)
|
| Автор: boostcoder 6.2.2012, 21:14 |
| на первый пример недавно наткнулся. потратил часа 4 на поиски бага. весь моцг себе вынес ### но самое смешное это то, что код я написал за час! |
| Автор: fish9370 6.2.2012, 21:35 | ||
функция возвращает список регулярных файлов в директории..
это набросок одной из функций, которая мне нужна, в нем две грубейшие ошибки.. пожалуйста назовите их.. |
| Автор: feodorv 6.2.2012, 23:24 |
Честно говоря, тема не об этом... Ошибок много: Не проверяется выход за пределы буфера. при выходе за пределы буфера start будет показывать мимо буфера Тут тоже нужно вставить проверку, что вы не превысили лимит m_size... Не проверяется возвращаемое значение, а вдруг файла уже нет... или PATH_MAX не хватило... и в file_info мусор... Раз plen может оказаться нулевой, то было бы неплохо перед strlen проверить prefix на NULL, если, конечно, Вы не пользуетесь исключительно browse_dir( ..., ""); Если предполагается, что в matches ещё ничего нет, то нужно правильно проинициализировать start: *start = 0; dirp не проверяется на NULL... Ну и можно в конце сделать buff[*start] = '\0', если место ещё оставалось... И конечную ';' (если она есть) поглотить, но я не знаю, как буфер будет использоваться дальше... |
| Автор: borisbn 7.2.2012, 08:28 |
ну дык, стандарт: 20/80. ну, почти По поводу выхода за границы массива - пользуйтесь STL. |
| Автор: boostcoder 7.2.2012, 10:48 |
| borisbn, попроси модераторов чтоб удалили все начиная с третьего поста. fish9370, буду знать, какой код ты пишешь ;) Добавлено через 30 секунд или со второго) он тоже оффтоп. |
| Автор: newbee 7.2.2012, 11:00 |
| Сложно вспомнить какие-то конкретные часто повторяющиеся проблемы. Но если в целом охарактеризовать грабли, на которые я периодически наступаю, - это необходимость писать на С++. Ниже я приведу немного конкретики, но без примеров кода. Если захотите кода по определенным пунктам, его есть у меня. Вот тут на форуме один чувак... volatile или как-то так... просто прется, что С++ остается все таким же "простым" и делает именно то, что требует от него программист. С моей точки зрения, для языка, позиционирующего себя как высокоуровневый, с настолько переусложненным синтаксисом, продолжать оставаться надстройкой над ассемблером недопустимо. В стандартной библиотеке языка все пучком... Конечно в ней очень многого не хватает, но в целом хотя бы ее дизайн очень хорош. Но в core language писать и не удивляться на неочевидности невозможно!
|
| Автор: borisbn 7.2.2012, 11:09 | ||
done. кроме сообщ. newbee |
| Автор: newbee 7.2.2012, 12:18 |
| Это я начала) Слушала одноименную с минусом песню ленинграда, читала тему и как-то не удержалась ( Напротив, поциент демонстрирует способность к социальной адаптации. Код читается так: если в теме встречается юзернейм "бусткодер", я затыкаюсь и ухожу. |
| Автор: Static 7.2.2012, 12:29 | ||||
| эээ, народ... спокойно! мое любимое:
Еще, когда только начинал работать, - отлично прошелся по конструкторам копирования. Точнее, по их отсутствию) Еще хорошо стреляет неправильно написанная проверка выхода из рекурсии. Которая спокойно работает пару месяцев, а потом начинает крашиться. Исключительно в релизе, например. Еще вот такое
В релизе, естественно, падает =) Сейчас еще, может, чего-нибудь вспомню. |
| Автор: boostcoder 7.2.2012, 12:38 |
полагаю, намек на происхождение от слова http://lurkmore.to/%D0%9F%D0%BE%D1%86 ;) Добавлено через 4 минуты и 1 секунду newbee, про виртуальную хрень и наследование ты же в курсе: используй функциональный стиль. С++ при этом становится как Си_на_стеройдах! |
| Автор: borisbn 7.2.2012, 12:47 | ||
про остальное, вроде, понял, а это - никак не пойму. чойта ? |
| Автор: newbee 7.2.2012, 12:54 |
| Вызови из конструктора виртуальный метод например. ФП не панацея, в С++ ФП неудобен. /*Смотрела недавно бустовский феникс, не знала плакать или смеяться*/ |
| Автор: borisbn 7.2.2012, 13:03 |
не вижу проблем... да, поведение будет отличаться от вызова той же функции не из конструктора. на момент работы конструктора базового класса виртуальной таблицы наследника не существует, как и самого наследника. это как если бы папа и сын родились одновременно |
| Автор: newbee 7.2.2012, 13:18 | ||
Вот я и написала: конструктор вызывается где-то посреди процесса создания объекта. |
| Автор: mes 7.2.2012, 15:42 |
| newbee, с каким из императивных языков ведешь сравнение С++ ? сразу отмечу, что сравнение с Шарпом не честное, так как конечный код выполняется в разных средах... также как и с любимым некоторыми Обероном... если с Делфи, то лично я сбежал с него на С++ в силу ограниченности первого.. если просто как критика С++, то соглашусь со многим, но тут надо учесть, что С++ язык естесственного развития, плюс нацеленный на высокую производительность, что, к сожалению, выливается в кривизне многих решений.. И все упирается в вопрос , а где ж (императивная) альтернатива ?! |
| Автор: borisbn 7.2.2012, 15:45 |
| mes, не думаю, что у Вас есть грабли, но может поищете в загажниках ? Ну признайтесь, приходилось же наступать хоть дважды ? Может не в своём коде, а в том, который приходилось инспектировать ? |
| Автор: Artemon 7.2.2012, 15:51 | ||
Изредка горю на таком, когда во втором цикле забываешь изменить имя переменной, которое пришло туда после копи паста. |
| Автор: newbee 7.2.2012, 17:01 | ||||
Ни с каким конкретным языком я не сравнивала, а старалась выделить объективные недостатки. Естественно мое мнение по определению субъективно, но оглядываясь на отзывы других трезвых плюсистов и тем, что даже тут вроде как все согласны с моими тезисами, склоняюсь считать это мнение более или менее объективным.
В этот вопрос вообще ничего не упирается на самом деле. Кривизна С++ не зависит от наличия альтернатив. Тот же C#, с которым ты почему-то запретил сравнивать, намного лучше и логичней... Мы ведь рассматриваем языки, а не платформы. А для меня альтернативой стал CL ;). |
| Автор: mes 7.2.2012, 19:17 | ||||||
потому что С# является языком развитой ОО-среды, и был заточен под нее.. С++ ж ложится на плоскую Ось, добавляя для нее ООП примитивы, но при этом не сильно отходя, чтоб оставаться системным языком.. Увы, некотрые недостатки С++ тянут корни именно от платформы.. в следствии его "системопредназначености" и не учитывать этого нельзя...
При программировании, я думаю концепции, а потом отражаю ее в коде.. Увы дельфи ставил мне постоянно палки в колеса.. (я про Дельфи состояния 2007 года, сейчас он вроде обновился, и о последних изменениях я не в курсе) не на невнесение нового, а 1. внесение только того, что требуется (буст кстати служит полигоном для отработки новых идей) 2. незатрагиванием старого (обратная совместимость... бррр, но объем старого кода того требует)
увы, но с выходом нового стандарта появление новых инструментов перекрыло множество логических прошлых дыр, и для того чтоб программить, не нужно знать устаревший ком, оставленный для совместимости Добавлено через 1 минуту и 7 секунд другой вопрос, что затянули они с этим стандартом.. его бы года 3 назад, как раз в пору пришлось бы... |
| Автор: mes 7.2.2012, 19:45 | ||
Я не слишком много программлю. чтоб умудриться дважды наступить на одни и те же.. но опасные, неочевидные моменты конечно попадались.. Случай первый: Программа вроде бы идеально работала, поко я не установил себе google desktop.. После этого начились вылеты.. после деинсталяции оного приложения, прога заработала снова на ура.. оказалось я забыл обнулить один указатель член класса.. Случай два произошел из за того, что (упростим картину) в деструкторе одного статического объекта, было обращение к другому статическому.. В зависимости от "порядка компиляции" появлалась ошибка сегментации при закрытии проги.. http://forum.vingrad.ru/forum/topic-216957/anchor-entry1552332/0.html Больше "серьезных" (для полугодовалого знакомства с языком не было) ошибок, которые бы заставляли попотеть не было.. Хотя для обнаружения этих от дебагера понадобился лишь стек вызовов - смущало скорее всего лишь неправдоподобие ситуации.. |
| Автор: newbee 7.2.2012, 21:20 | ||
| Ну... Все эти аргументы об "особенности" с++... и ось плоская, и системный... не выдерживают никакой критики. Страуструпу никто не мешал сделать нормальное ОО-расширение си,.. примеров хороших реализаций ООП уже было... но он сделал то, что сделал. Да и дело то вовсе не в ООП ведь, а в целом в хаотической сущности языка, нет стройности. И еще порцию идиотизма приносят обсаженные авторы всеми здесь любимого буста, половина библиотек которого формально следуют синтаксису с++, но де-факто расширяют его, причем самым дебильным способом - переопределением операторов. Две стоящие друг за другом строки a % b % c могут делать совершенно разные вещи, выдавать абсолютно невдупляемые ошибки компиляции, но зато блядь круто-то как! Теперь дельфи. Вполне себе системный язык в том числе, из архитектурных изъянов которого обычно выделяют неMVCшность гуекодирования и еще что-то в этом духе. Простой, как и в С++, но очевидный и работающий так, как должно работать, а не как решило больное воображение страуса, ООП. Хочешь процедурный стиль - пиши, на ООП свет клином не сошелся. Вообще неправильно ставить в вину кривизне языка его "системопредназначенность". Никто же не говорит о невозможности модификации классов в рантайме и прочих прелестях динамических языков, отсутствующих в с++ по понятным причинам. Но то, что сделано криво, могло быть сделано прямо.
Добавлено через 8 минут и 12 секунд Не хочу скатывать тему в холивор с собой в главные роли, поэтому в дальнейшем воздержусь тут от пустого балабольства. Просили высказаться по поводу граблей - я высказалась)) Ну если у кого будет здоровая аргументация, обязательно вернусь ) |
| Автор: mes 8.2.2012, 00:04 | ||||||||
так есть же объективС, что ж все на него не перейдут, раз Страуструп ерунду придумал ?
эх не люблю я чистое ООП... могло бы.. абсолютно согласен.. продуманности мало.. хотелосьбы конечно поменьше ляпов.. (маленькое оправдание, что остальным языкам было легче, видя проблемы С++ )
ну терь появилась возможность отделить лвалуе, а не пристыковавть их к константной ссылке с продлением жизни.. чиго я не понимаю, почему до сих пор этот препроцессор не развили... Добавлено через 2 минуты и 48 секунд
в этом и есть одна и затей буста.. опробывать в какую сторону менять язык )
а я наоборот люблю это, правда когда с умом продуманы операторы |
| Автор: volatile 8.2.2012, 00:08 | ||
Я понимаю конечно, что лисп (или как-то так...), делает совершенно не то что требует от негго программист. Но это вовсе не основание, чтобы такую затею переносить на С++ Пишите на лиспе. Что вам от С++ то нужно? |
| Автор: newbee 8.2.2012, 00:30 |
| volatile, я рада, что смогла вытащить твою грудь на амбразуру в защиту любимого языка, но может быть все же скажешь что-нибудь не только в пустоту? Я за лиспы тут не агитирую и вообще, хоть и разбавляю свои комментарии изрядной порцией экспрессии и баловства, но все же пишу о вполне конкретных вещах. |
| Автор: boostcoder 8.2.2012, 00:40 |
такой, какой он сейчас - его вовсе запретить нужно! тот же bash - как скриптовый микро-ЯП, в разы лучше(массивы/словари/карты/функции). и синтаксис не самый сложный(как у перл). почему бы что-то подобное не делает препроцессор? ну а newbee могу лишь сказать то, что говорю обычно: чем виноват тебе инструмент, если ты им пользоваться не умеешь? |
| Автор: borisbn 8.2.2012, 08:52 |
| История mes о google desktop напомнила... Как-то 29 марта (это существенно) подходит ко мне молодой коллега Дима и говорит, что наша программа не пишет в БД. Я, ессно, спрашиваю "что менял" - отвечает "ничего". Ставим старую версию программы - не пишет. Ставим старую версию базы - не пишет. И так продолжалось 3 дня. 1-го апреля подходит Дима и говорит, что программа стала писать в БД. Я думал первоапрельский розыгрыш. Пошёл проверил. Старая версия программы в старую версию БД пишет. Новая - тоже... В итоге что выяснилось: эту программу писали давным-давно ещё под DOS. Дима же переделывал её под Windows. В DOS в структуре, в которой хранится дата, месяц считается от 0, а в windows'овской структуре - от единицы. При записи в базу старый формат даты преобразовывался в новый без учёта этой особенности. Таким образом получалось, что мы пытались записать в БД 29 февраля, затем 30-е, затем 31-е... СУБД отказывалась воспринимать эти даты, а вот первое марта - пожалуйста. Как никто не заметил, что дата в БД отличается на месяц - не знаю |
| Автор: Earnest 8.2.2012, 10:04 |
| fish9370, веди себя прилично! borisbn, ты тоже. Когда один хамит, а другой отвечает тем же - виноваты оба! Последние два сообщения, пожалуй, удалю, чтобы не портить впечатления от темы. ... Так, уже не два, бусткодер и ньюби подключились к срачу. Вам что, господа, делать нечего совсем? Рабочий день на дворе! |
| Автор: borisbn 8.2.2012, 10:16 |
| Earnest, сорри, что сорвался, но достал он уже хамить. Кста, и я тоже всё, всё, всё... действительно, работать надо. /me пошёл делать очередные грабли )) |
| Автор: newbee 8.2.2012, 10:31 |
| Не флейма ради, на справедливости для, я продублирую свое удаленное сообщение: фишка, выкладывай уже ссылки на свои программы. Желательно в отдельную тему, там и будем смотреть, пока пустой треп от тебя. А потом, как создашь тему, попросим модераторов в очередной раз подчистить тут. |
| Автор: Earnest 8.2.2012, 11:15 |
| Это пожалуйста. Хотите померять чей-то код - не проблема. Но в отдельной теме. И интеллигентно. |