LINUX.ORG.RU

Написал небольшую книгу для C/C++ программистов

 , , , ,


13

8

Здравствуйте. Меня зовут Андрей Карпов. Сфера моих интересов - язык C/C++ и продвижение методологии статического анализа кода. На протяжении пяти лет я являюсь Microsoft MVP в номинации Visual C++. Основная цель моих статей и работы, сделать код программ немножко безопасней и качественней. Буду рад, если эта мини-книга научит вас писать более надежный код и предостережет от некоторых типовых ошибок. Немало полезного здесь можно будет почерпнуть и тем, кто занимается написанием стандартов кодирования для своих компаний.

Немного истории. Не так давно я создал ресурс, на котором делился различными полезными советами по программированию на языке С++. Ресурс не собрал ожидаемое количество подписчиков, поэтому я не вижу смысла приводить здесь на него ссылку. Сайт просуществует какое-то время, после чего уйдет в небытие. А вот советы достойны сохранения. Поэтому я доработал, пополнил эти советы и объединил их в единый текст. Желаю приятного чтения.

UPD: PDF-версия: https://yadi.sk/i/RCHauHFBr2cSs

P.S. Пользуясь случаем приглашаю всех желающих последовать за мной в Twitter: @Code_Analysis.

>>> Главный вопрос программирования, рефакторинга и всего такого



Проверено: beastie ()
Последнее исправление: Aceler (всего исправлений: 3)

Ответ на: комментарий от Displacer

Если что, то в РФ и на постсоветском пространстве широко распространён формат fb2. Книжки в html как-то немного дурной тон.

Техническую книжку в fb2 делать - это дурной тон и лишнее время.

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

скажите пожалста, а Карпов, который был деканом факультета кибернетики в ТулГУ, вам случаем родственником не приходится?

К сожалению, нет (как бы мне тогда легко училось.... :)

Andrey_Karpov_2009
() автор топика

В целом, статья - сборник известных постулатов, и подойдёт начинающим. На англоязычных ресурсах уже давно разжевано. В частности CppCoreGuidelines.

К сожалению, сильно MS-специфична.

RazrFalcon ★★★★★
()

Скачал. Спасибо за книжку.

Odalist ★★★★★
()

Не хватает самой главной рекомендации: прекратите уже писать на C++ и возьмите язык, проектировщики которого лучше позаботились о непростреливании ног.

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

Есть cppcheck, хоть и послабее в плане анализа.

xaizek ★★★★★
()

Привязка к МС очень сильна и в тексте. DllMain, TCHAR, BSTR. Все это не про C++, а про костыли от МС. Рекомендация не использовать сторонних библиотек и вовсе никуда не годится, если Вы хотите рекомендовать эту книгу здесь.

Displacer ★★
()

Поработаю пруфридером.

Пункт 8:

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

Конечно, не всегда можно сделать конструктор простым, но я считаю, что к этому надо стремиться. Более того, сложный деструктор, как правило, говорит о плохом дизайне класса и о непродуманности решений.

Имелся в виду деструктор?

Пункт 18. Это уже в вашем анализаторе:

Decreased performance. Calls to the 'strlen' function have being made multiple times when a condition for the loop's continuation was calculated.

“been” всё-таки.

shdown
()

написано в стиле 24 Deadly Sins of Software Security, однако читается хуже, некоторые проблемы высосаны из пальца, виндовые примеры, реклама пвс-студио.

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

Техническую книжку в fb2 делать - это дурной тон и лишнее время.

Я бы не назвал это технической книгой во первых, а во вторых какие альтернативы будут лучше и почему?

Displacer ★★
()

12. Занимаясь Copy-Paste, сосредоточьтесь в конце работы

https://en.wikipedia.org/wiki/Don't_repeat_yourself

13. Выравнивайте однотипный код «таблицей»
14. Помните: не всегда достаточно компилятора и хорошего стиля кодирования
31. В C и C++ массивы не передаются по значению
33. Никогда не разыменовывайте нулевые указатели
...

Для кого эта книга?

TDrive ★★★★★
()

Как-то meh. Ваши статьи с анализом проектов местами интереснее. Это не книга для программистов, это книга для тех, кто никогда не писал на C/C++. Ну, или статья на швабр.

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

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

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

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

На винфак сходить уже предлагали?

Кстати, уже не первый раз уже слышу про «винфак». Это что вообще?

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

Из этого мнения имеют право на жизнь только «маневры». А за совет писать непортируемый код «потому что это никому не нужно» - нужно бить по рукам. В большинстве случаев написание портируемого кода не добавляет работы.

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

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

Ага, то есть это не просто невежество, а еще и воинствующее невежество :) Вы по постеснялись бы в неопытности незнакомых людей обвинять. Тем более что здесь всё-таки не хабр и речь идет о системах, которые построены на UNIX-принципах (это мягкий намек гуглить).

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

Первый же пример выглядит настолько эпично дико, что я вообще не понял, как он мог прийти автору в голову. Неужели на Си/Си++ так принято писать? Я всю жизнь учил людей и сам учился переходить к циклу или функции даже для 2 повторяющихся фрагментов кода. Но иногда лень. Ну бывают такие индивиды, которые тащат 3-4 фрагмента. Но 7? При том, что там всё прозрачно масштабируется? Для кого вы это писали, для клинических идиотов? Им не нужен рефакториг и ваша студия, им не нужен консультант по Си/Си++, их нужно учить программированию. С начала. Можно даже по учебнику помянутого здесь недавно Столярова.

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

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

Всё зависит от ситуации. Если человек тянет библиотеку криптографии/архивирования только из-за того, что ему потребовался CRC32 - то да, шлёпать и заставлять писать свой вариант (скопировать нужный кусочек из достойного места).

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

Первый же пример выглядит настолько эпично дико, что я вообще не понял, как он мог прийти автору в голову. Неужели на Си/Си++ так принято писать? Я всю жизнь учил людей и сам учился переходить к циклу или функции даже для 2 повторяющихся фрагментов кода.

Кхм.. Подождите. Все фрагменты кода взяты из реальных приложений. Например, первый фрагмент взят из проекта MySQL, о чем сказано в статье. Посмотрите внимательно, каждый кусочек кода отсылает к первоисточнику (MySQL, CoreCLR, Audacity, Haiku, LibreOffice, Pixie, Notepad++ и так далее).

Прошу всё-таки почитать статью, а не просматривать её по диагонали.

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

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

Я считаю эту главу очень важной и всячески буду продвигать своё мнение. Я считаю, что этим могу принести пользу миру

Вы сюда потроллить ходите?

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

Ради производительности? И каков прирост? Кто мерил? И тогда уж вдогонку давайте избавимся от массива, сделаем 7 скалярных переменных.

Vudod ★★★★★
()

Спасибо, интересно.

Заметил пару помарок:

  • если она располагается в теле цикле.
  • всегда можно сделать конструктор деструктор простым
Beewek ★★
()
Ответ на: комментарий от Andrey_Karpov_2009

это же маразм

притащить новую библиотеку в виде зависимости на GNU/Linux системе практически ничего не стоит - указать новый пакет в зависимостях и поправить конфиги сборочной системы, всё

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

а на винде да, зависимости - это боль и страдания

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

Заметил пару помарок:

Спасибо Вам и всем остальным, кто указывает на недочёты. Я их собираю, а потом внесу правки и завтра перевыложу документ. Но отвечать далее не буду, чтоб не загромождать обсуждение. Всем заранее спасибо за такие комментарии.

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

Да, я понял. Хорошо, что я не преподаю Си++ и не имею с ним никакого дела. Всё же в нормальных языках такое безобразие реже допускают.

Vudod ★★★★★
()

Хм. Если вы не уделяете много внимания виндо-специфичным вещам, то с радостью почитаю вашу книгу. В последнее время с проф.литературой напряг.

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

Неужели на Си/Си++ так принято писать? Я всю жизнь учил людей и сам учился переходить к циклу или функции даже для 2 повторяющихся фрагментов кода.

Т.е. о производительности в _реальных_ проектах вы не слышали, а только _учили_ писать код студентов. Окей, так и запишем.

znenyegvkby
()

Омские линуксоиды интересуются...

А какова лицензия на книгу? Вы посадите всех в тюрьму за её чтение?

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

вручную развёрнут цикл ради производительности

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

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

Ладно, был неправ. Пролистал книжку, дельные советы. Спасибо.

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

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

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

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

извиняюсь, на самом деле crc32 в Zlib, от которой больше половины пакетов зависит :)

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

Неужели на Си/Си++ так принято писать? Я всю жизнь учил людей и сам учился переходить к циклу или функции даже для 2 повторяющихся фрагментов кода

К сожалению, такого кода попадается достаточно много. Например: https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/src/Cedar/Win32Com.c...

или вот https://github.com/Z3Prover/z3/blob/master/src/smt/mam.cpp#L2298

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

хороший сборник, спасибо.

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