Андрей Карпов, специализирующийся на системах статического анализа кода, опубликовал (http://www.viva64.com/ru/b/0391/) практические рекомендации по программированию на языках С/С++, основанные на ошибках, выявленных при проверке различных открытых проектов. В большинстве своем советы универсальны и будут интересны программистам, использующим и другие языки. Каждая рекомендация сопровождается практическим примером с разъяснением. Целью статьи является предостережение программиста от ошибок, с которыми он может столкнуться при написании кода.
URL: http://www.viva64.com/ru/b/0391/
Новость: http://www.opennet.me/opennews/art.shtml?num=44245
Спасибо, побольше бы здесь подобных статей
Статья (на opennet) информативна наредкость. И объёмна в одинаковой с информативностью степени.
Не стал читать, текста много #sidebar мешает, выложите в markdown на 100%
Включи в фарфоксе "Режим чтения" и ничего не помешает.
От этого он типографику не дорисует.
Что это
>> Целью статьи является предостережение программиста от ошибок,
>> с которыми он может столкнуться при написании кода.??
На каком это языке написано?
Кто на ком стоял?Предостеречь можно человека от совершения им собственных ошибок или от столкновения с чужими.
А при написании кода столкнуться человек может с трудностями, а не со свои ми же ошибками.
А по поводу статьи что скажешь?
Реклама PVS-Studio :)
Если бы вся реклама была такой полезной и информативной, я бы удалил uBlock...
> А по поводу статьи что скажешь?Скажу так: автор грамотный и опытный разработчик. И, что самое главное, хорошо и системно подходящий к изложению материала и своих идей.
Но вот с формой подачи этого материала и примерами уже неоднозначно.
Статья интересная, но местами противоречивая.
Автор хоть и берёт примеры кода из открытых проектов, всё повествование строит вокруг Windows, Visual Studio, WinAPI и т.п.
Полезное там, несомненно, есть, но далеко не для всей аудитории опеннета.Ну и часть примеров разобранных ошибок представляет собой "не опечатывайтесь в коде", "проверяйте код после копипасты", "пишите код внимательно и внимательно его перечитывайте", "форматируйте код таблчино, так его удобно читать и легче увидеть ошибки" и т.п.
При этом автор сам опечатывается в тексте статьи.("результат работы функции memcmp() нельзя пометить в переменную"), пропускает знаки препинания, путает тире с дефисом, неправильно применяет падежи.Всё это в итоге вызывает ощущение, что начало и задумка были отличными, но для увеличения объёма статьи туда навставляли пачку странных примеров от КО.
Поэтому и целевая аудитория статьи становится размытой и непонятной.Ежели статью поделить на две части "для тех, кто пишет первое Hello, World" и "для более опытных", причесать форму подачи и исправить безграмотность текста, будет совсем отлично.
Автору желаю успехов и совершенствования.
> Автор хоть и берёт примеры кода из открытых проектов, всё повествование строит вокруг Windows, Visual Studio, WinAPI и т.п.Автор просто не может брать примеры кода из проприетарных проектов, хотя именно они - целевая аудитория продукта. Вот и весь парадокс.
>> Автор хоть и берёт примеры кода из открытых проектов, всё повествование строит вокруг Windows, Visual Studio, WinAPI и т.п.
> Автор просто не может брать примеры кода из проприетарных проектов, хотя именно
> они - целевая аудитория продукта. Вот и весь парадокс.В таком случае у многих может возникнуть недоумение и вопрос "А при чём здесь, собственно, опеннет?!"
))
Да, к сожалению, думать шире одной мысли многие не умеют. Но это их проблема, а не Опеннета.
У вас же такого вопроса не возникло? И у меня не возникло. Так чего ради нам с вами волноваться по поводу скудных мыслишек этих "многих"?
Да нет никких вопросов. Опеннет - возможность для этого хрена лишний раз пропиариться. Желаю ему разориться побыстрее.
Вы сами-то на каких языках читаете и пишете?
Судя по вашему комментарию, эти языки разные и не один из них не русский.
"не один" -> "ни один"
> Вы сами-то на каких языках читаете и пишете?
> Судя по вашему комментарию, эти языки разные и не один из них
> не русский.И что же именно в моём комментарии позволяет Вам, любезный, делать такие выводы?
Разверните, не сочтите за труд.Ну и выше уже ткнули палочкой в Ваше неумение пользоваться частицами.
"не один из них" – это "садись, 2", школьная программа не осилена.
Спасибо.
> Спасибо.Пожалуйста. По существу есть что вякнуть?
Причина разбора и допущения большинства ошибок в коротких названиях И неоднозначных сокращениях переменных от которых рябит в глазах. Надо называть например: = ostatochnStoimostOsnSredstv.
Надо называть FixedAssets->ResidualValue. Транслит в топку.
Ну да или так.
Кстати, а как перевести на англ. аббревиатуру - СНИЛС? inia?
В США есть SSN (Social Security Number), но это не перевод, а примерный аналог СНИЛС. Имеет ли смысл переводить такие аббревиатуры?
Вам бы романы писать, а не код :)
нет, не так. ostatochnayaStoimostOS ))
Откуда восторг? кто-то нашёл в статье хоть что-то новое? Убогая реклама, как она есть.
Вопрос, видимо, предполагался как риторический. А зря.
Кстати, вам, возможно, иногда стоит отключать АдБлок и вспоминать, как на самом деле выглядит убогая реклама.
Так ни строчки же того, что не пишется в учебниках. Ни одного оригинального примера - все скучны до ужаса.
> Так ни строчки же того, что не пишется в учебниках.Название учебника, в котором описан, скажем, пример № 5 - в студию, пожалуйста.
Только не статьи и документацию, а учебник. Вы же о них заявили.
Вопрос не ко мне - я под винду не пишу.И, кстати, ладно статьи - но документацию по системе, для которой пишешь, знать надо, это ровно такие же азы, как, скажем, то, что надо знать, что является UB.
Напрашивается вопрос к вам: а что ж вы тогда так безапелляционно заявляете о том, в чем не разбираетесь?
Никогда в жизни не возникало ситуции, когда бы memcmp сравнивалось с -1 или 1, это же тупость, впрочем, большенство примеров из этого разряда - учебник по копипасте и rtfm'у.Если есть примеры плохого кода - для 32 и 64 разрядных систем, не переносимые примеры от win к *nix и обратно, то почему автор игнорит big/little-endian, но это риторический вопрос.
Хотя пример о dll, и рассуждения об ошибках компилятора заставляют задуматься о том, собирал ли автор программы с использованием gcc, который при настройках оптимизации может довольно простой код извратить.
№13 - порадовал, меняем шило на мыло, по башке стучать за такой код, тем более проверка errno, - это либо if(errno), либо switch(errno) {}.
ИМХО записки виндузятника о костылях и граблях, кстате удивлен, что под винду нет редактора с возможностью выделять столбцы символов, может автор не осилил, но снимает вопросы с табличным стилем на раз-два.
Ну вот, еще один специалист знает предмет лучше автора, но при этом почему-то тратит свое драгоценное время на выискивание блох в его статье вместо того, чтобы просто дать ссылку на свою, более правильную. Может быть, даже написанную со спеллчекером....
Не исключаю, что он и впрямь может так написать. Вот только зачем ему писать статьи по Visual Studio и WinAPI? Тебе нужно - ты и пиши.
Не исключаю, что он на этом заработал свой первый миллион.
Вот только нам с вами от этого ни горячо, ни холодно.
А вы, собственно, обсуждаемую статью читали? WinAPI там скорее эпизодичен.
> Не исключаю, что он на этом заработал свой первый миллион.Сомневаюсь, что хоть кто-то из вас, включая его, в теме, как зарабатывается миллион. Не рублей, разумеется.
Есть вопросы по теме, или сказать больше нечего
> кто-то нашёл в статье хоть что-то новое?Ага. Стыдно, но вообще не знал про nullptr
Надо почитать про эти ваги модные c++v11+
На плюсах пишете и до сих пор не прочли о "новинках" C++11? Ну да, таки надо почитать. И не только описание новинок, но и о best practices, Мейерса того же.
Тогда уж сразу читайте и про C++14, он, по сути, дополняет С++11. А то скоро будет C++17, всё скопом осиливать будет сложнее.
>> кто-то нашёл в статье хоть что-то новое?
> Ага. Стыдно, но вообще не знал про nullptr
> Надо почитать про эти ваги модные c++v11+Он мягко выражаясь не нужен.
> Он мягко выражаясь не нужен.(nullptr не нужен). История берёт начало с того, как в 90х дебилята внесли в документы запрет определять в C++ NULL как (void*)0. В то время как это единственно правильное его определение и есть...
> Откуда восторг? кто-то нашёл в статье хоть что-то новое? Убогая реклама, как она есть.Это ты так пытался прорекламировать свои безграничные познания и непогрешимость как кодера? Скромнее надо быть.
Кстати, в п.39 автор написал полный бред, не отличив логический | от битового и накинувшись на совершенно правильный код.
Вы в данном случае себя имеете в виду? Логический | выглядит примерно так: ||.
Ну, и использование в битовом сложении заведомого нуля - это, может быть, и рабочий код, но как-то попахивает.
Какая разница, нуль или нет? Допустим, для каких-то других случаев база была бы объявлена не в нуль, а в какую-то комбинацию флагов. И в зависимости от условия к ней доабвляется один или другой флаг. Автор статьи явно на сях сто лет не пишет, вот и пугается обычных сишных конструкций.
Зато вы, видимо, пишете на Сях так долго, что уже не помните разницы между | и ||.
Вместо признания собственной ошибки гнать на того, кого огульно охаял - так, конечно, поступают только зрелые мужи.
Блин, протупил. Да, забыты скобки, и разные виды or здесь не важны.P.S. Впрочем, PVSStudio один хрен желаю скорейшей смерти, ибо проприетарщина.
они совершенно бесплатно проверяют открытые проекты
> они совершенно бесплатно проверяют открытые проектыони используют открытые проекты для совершенно бесплатной навязчивой рекламы
//fixed
Навязчивой? Вам тоже стоит хотя бы временно выключить АдБлок и откалибровать свои воспоминания о реальности.
мужик - ты наконец ответишь за свои слова?
Ты говорил что на P970 есть новый андроид, покажи же его!
Или мужик сказал, мужик забрал свое слово?
>типичных ошибок при разработке на С/С++надо было писать на Ada/Go/Rust/Python/Pascal
Ага, а лучше на всём этом сразу и получить "типичные ошибки Ada/Go/Rust/Python/Pascal".
Не надо искать серебряную пулю, ни один язык не застрахует вас от кривых рук и прямых извилин.
серьёзные разработчики думаю давно используют анализаторы.Другое дело, что закрытый код анализатора автора статьи вдруг не проверен статическим анализатором или автор прогнал программу в обратную сторону -чтобы насажать всевозможных ошибок. В любом случае, если есть боязнь,что код утечёт в Интернет и этим навредит программисту лучше разрабатывать на компьютере не подключенному к сети, а то такой анализатор или компилятор вылетил с ошибкой, а потом отошлёт весь дамп системы со всем кодом куда-нибудь в Интернет...
>[оверквотинг удален]
>
> static int rr_cmp(uchar *a,uchar *b)
> {
> for (size_t i = 0; i < 7; ++i)
> {
> if (a[i] != b[i])
> return a[i] - b[i];
> }
> return a[7] - b[7];
> }И имеем магическую циферку 7. У нас на Юпитере sizeof(uchar) == 46, после этого расхотелось читать дальше.
Тьфу ты, сорри, пятница внесла в голову сумбур - "дело было не в битах, а массивах...". Удалите предыдущий коммент.
вас, юпитериацев, не понять...
Спасибо автору. Почитал, подумал, отвёл душу. Хорошо что я не один на этом свете думаю о таких вещах при написании кода. Спасибо.
Какой ужасный пиар, какие ужасные боты в комментариях.
Да ничего ужасного, на самом деле. Просто они были по-пятничному расслаблены и искренне полагали, что их клич "Огня! Еще огня!" подхватит толпа. Так что аргументацией своих плевков не озаботились.
Автору и создателю PVS. Когда и почему будет открыт код продукта?
И да, спасибо за хорошую статью!
Просмотрел наискось, и то, только половину осилил. На правах рекламы некоего PVS-Studio? "Ошибки" из разряда "для самых маленьких". Не серьезно как-то.
Там перед примерами - названия этих "самых маленьких". Временами довольно известные названия.
Вообще, ошибке необязательно быть головоломной, чтобы представлять проблему. Особенно если на практике оказывается, что допустить такую ошибку легко, а заметить - трудно.
Такую бы энернию, да на пользу людям. 10 минут не проходит без оправдания, на любой негативный комент, по поводу довольно паршивой заказной, рекламной статейки. Всмомнилось:
Пренебрегая словесами, Жизнь убеждает нас опять: Талантам надо помогать, Бездарности пробьются сами. :P
Приятно наконец пообщаться с культурным человеком. Может быть, вы еще и подберете аргументы к эпитету "паршивой"? Остальное возражений не вызывает.
> Такую бы энернию, да на пользу людям. 10 минут не проходит без
> оправдания, на любой негативный комент, по поводу довольно паршивой заказной, рекламной
> статейки. Всмомнилось:
> Пренебрегая словесами, Жизнь убеждает нас опять: Талантам надо помогать, Бездарности пробьются
> сами. :PЭти ребята регулярно проходятся по открытым проектам, сообщая разработчикам о найденных проблемах. То есть, неплохо так помогают сообществу open source. В отличие от 95% форумных комментаторов.
>допустить такую ошибку легко, а заметить - трудно.Согласен. Однако, еще труднее найти ошибку, основанную на непонимании или незнании некоторых тонких вещей, вроде работы с вещественными числами, архитектурными особенностями и пр. undefined behaviour. Это уж, если речь идет о Си и плюсах. Мне кажется, нечто подобное и ожидали увидеть те из разочарованных читателей, которые не поленились проследовать по ссылке.
Впрочем, против предлагаемого ПО я ничего не имею, вещь, должно быть, полезная в любом случае, т.к. даже и такие "опечатки" приходится искать и править. Хорошо, если разумное участие будет при этом минимальным. Благодарю.
Дело в том, что как раз архитектурные особенности, работу с вещественными числами и пр. UB разбирают во многих учебниках. А вот напоминаний "злоупотребляя копипастой, не забывайте проверить, не пострадал ли смысл" точно ни в одном учебнике не найдешь. Мне статья кажется именно альтернативой учебникам, открывающей некоторые проблемы с не вполне академической стороны.Конечно, статья рекламная. Однако, на мой взгляд, статья представляет из себя тот образец рекламы, к которому нужно стремиться многим и многим. Я автору, признаться, завидую белой завистью - примерно так же, как Сергею Абдульманову, показывающему высочайший класс в рекламе "Мосигры". Наверное, поэтому и бросился лаяться с теми, кому невмочь было пройти мимо, не пнув... Хотя самому автору, подозреваю, безразличны крики на форумах - на Хабре ровно такое же бурление под каждой статьей, так там хоть аудитория побольше.