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)

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

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

Наверное. А из-за головоломной сложности этой оптимизации они сделали маленькую ошибку.

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

Не факт, я может бы не в теме, какую именно версию анализировал товарищ Карпов, но в 5.7.12 уже давно

static int rr_cmp(const void *p_ref_length, const void *a, const void *b)
{
  size_t ref_length= *(static_cast<size_t*>(const_cast<void*>(p_ref_length)));
  DBUG_ASSERT(ref_length <= MAX_REFLENGTH);
  return memcmp(a, b, ref_length);
}
...

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

См. комментарий выше. Я как бы хотел сказать что поинт не в том, плохой там или хороший изначально был код. Поинт в том, что это как-бэ самые внутрянки, и к ним не подпускают джунов за 18 рублей. Если кто-то посчитал _изначально_ код го*ном, сл-но можно сделать простой вывод – мускуль идет в помойку.

znenyegvkby
()

так полистав эту книжку о5 убеждаю себя что в C++ можно легко «отстрелить» себе ногу. в С++ 14 были введены функции stl типа emplace_back ... до этого размотка конструкторов при любом вводе данных была нормой ... наконец то додумались до семантики перемещения и rvalue ... до этого тупа тратили процессорное время на конструктора копирования, перемещения и т.д. ... при этом многие программисты с умным видом указывали что расходы на вычисления в этом случае «незначительны» ... эта незначительность в итоге выливаться в деньги и время ... понимаю что это к теме не относится но просто кажется возмутительным ... насколько я понял в rust и Go это проблема решена.

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

Если бы эта лшибка была критична, ее бы и нашли гораздо раньше.

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

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

Я, как и Кнут, считаю, что преждевременная оптимизация - корень всех зол.

И как бы от неё вовсе избавиться в коде? Потому что если её провести и потом по делу, код всё равно станет нечитаем. У меня такая мечта: писатели компиляторов составляют справочник по тому, как на С и на С++ записывать типовые микро-задачи. Т.е. как с макроассемблером. А также наконец-то проведут такой рефакторинг кодовой базы компиляторов, чтобы программисты стали в состоянии добавлять в них шаблоны для новых обнаруженных микро-задач. В итоге - код остаётся насколько возможно обобщённым, а оптимизирующий компилятор занимается своей задачей - оптимизацией. Утопия?

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

Утопия?

Почему же. Нет. Просто пишите сразу на асме, зачем такие извращения?

писатели компиляторов составляют справочник по тому, как на С и на С++ записывать типовые микро-задачи. Т.е. как с макроассемблером. А также наконец-то проведут такой рефакторинг кодовой базы компиляторов, чтобы программисты стали в состоянии добавлять в них шаблоны для новых обнаруженных микро-задач.

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

У меня такая мечта: писатели компиляторов составляют справочник по тому, как на С и на С++ записывать типовые микро-задачи

т.е. придумывают новый язык

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

Почему же. Нет. Просто пишите сразу на асме, зачем такие извращения?

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

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

Если заглянуть в C++ проекты, то, кажется, что каждый из них написан на каком-то новом C++, а не том, что знаешь ты. Или описан у Страуструпа. А с микро-задачками - это как с паттернами. Т.е. одно и тоже можно закодить разными способами. И если договориться, что лучше так, то и читать быстрее, и ошибок меньше, и компилятору проще, и код быстрее.

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

А с микро-задачками - это как с паттернами.

А вот алгоритм сортировки, вроде бы такая простая вещь, если подумать :)) Вы считаете ее «микро-задачкой»? Ее можно внести в «справочник»?

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

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

Кстати, можно ещё сравнить с «CRISC» x86, но на уровне языка средне-выского уровня.

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

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

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

Я уже вижу эти багрепорты: «Build error: „Пусть тебе твои шлюхи код компилируют!“»

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

Но большинство серьезных проектов пишется именно на С++. Так что никуда вы с подводной ложки не денетесь.

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

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

Вот здесь «библиотеку» можно как раз заменить на «C++». Для нового проекта.

Спасибо за статью!

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

компилятор перепишут на ИИ/нейронных сетях.

Верной дорогой идете, товарищи xD

znenyegvkby
()

Лорчую, да удалите вы уже этот спам. Там новости программерские кто, админы-шелскрипты что-ли подтверждают? Этому максимум место в толксах, если вообще быть.

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

Это же PVS-студио! Их проект начал анализировать сам себя на наличие ошибок, но повис в бесконечном цикле xD

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

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

Расскажите какие большие проекты вы писали где вы с этим столкнулись.

xpahos ★★★★★
()

Фу, опять псв-студия. Достала эта херня болотная.

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

Да это она и есть. Чистой воды реклама. Чувак взял свои посты про псв-студию, скопипастил в ворд, сохранил в пдф, и - опа! - книга.

rupert ★★★★★
()

Андрей, а вот у меня вопрос такой — вы текст сначала на русском пишете, а потом на английский переводите, или наоборот?

fluorite ★★★★★
()

Здраствуйте Андрей! Не могли ли вы проверить с помощью статического анализатора такие проекты как R и Julia? Спасибо.

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

Так уж и сразу реклама. Просто тактичное напоминание вроде «Не льсти себе, подойди поближе». А то, судя по количеству ошибок, некоторые товарищи за 2 метра до писсуара стоят.

red75prim ★★★
()

Больше похоже на рекламу вашей дребедени, чем на книгу.

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

Академический подход с максимальной безопасностью <…> не всегда уместен.

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

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

Вот именно такое пренебрежительное отношение к своим потенциальным читателям и убивает весь интерес опусам товарищей из псв-студии.

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

Не люблю кругодрочить и спускаться до перехода на личности, но похоже, так оно и есть, лiл:

https://vk.com/mersinvald

https://habrahabr.ru/users/mersinvald/

Дата рождения: 20 сентября 1997

Принимая во внимание другие истории о 19-летних тимлидах, я хочу спросить: это акселерация, или что? В 30 лет люди будут уходить на пенсию, а в 35 умирать от китайской еды и грязного воздуха?

Deleted
()

автор уже осознал свою ошибку запостив на ЛОРе материал с вендоспецификой и непереносимым C++, скрылся в слезах?

а так да, молодец конечно, больше материалов - лучше

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

ну как причём, готовят почтву потихонечку, скоро выпилят NT , поставят на Ubuntu свои обои, уволят нахрен всех гавриков сертифицированных и начнут торговать MSLinux

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

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

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

Andrey_Karpov_2009> использования технологий Microsoft

Зачем ты рекламируешь вражеские технологии на сайте про СПО и линукс?

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

Andrey_Karpov_2009> А новость вообще об ином.

Да-да. Новость о том, какой офигенный Visual C++ и какой крутой PVS-Studio. В чём главный вопрос, книга так и не говорит, как и каков ответ на тот главный вопрос. Да и стиль и структура изложения потворствуют копипастингу кода вместо написания и мышления.

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

hobbit> Насколько мне известно, такая технология, как MS Core fonts, например, оказалась полезна многим линуксоидам.

Нет такой технологии. Мелкософт поналицензировал кучу шрифтов и всё. И «нужны» эта фиготень только в тех случаях, когда в мелкософтовском офисе документ сохранили, и форматирование без MS TT Core Fonts не совпадает с тем, которое изначально было. Тот же шрифт Computer Modern вообще во всех отношениях лучше смотрится как на печатном носителе, так и на дисплее.

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

Без рекламы.

Да, но зачем она тогда мне. :))

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

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

Andrey_Karpov_2009> На самом деле текст связан с MS очень слабо

4.2

Текст очень сильно связан с пиариаемым тобой PVS-Stuio, который MSVC++-only.

Andrey_Karpov_2009> рассматриваемые темы универсальны.

Универсальны настолько же, насколько универсальны идиоты не умеющие в логическое мышление, но лезущие писать код. То есть, последним и будет полезен тот текст.

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

Andrey_Karpov_2009> Текста много, а значит найдутся ляпы. Когда текст стабилизируется, тогда я подумаю над альтернативным его представлением.

Трындец полный. И ты ещё рекламируешь статический анализатор кода, не умея подбирать инструменты для задачи, и вместо этого лепя костыли и отговорки?

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

ii8_> 2009 - это год рождения?

Это был бы год рождения, если бы ник был -=AHgPIOXA_HaGu6aT0P_2009=-

Quasar ★★★★★
()

язык C/C++

Так уже лет 100 никто не пишет, только ископаемые разве.

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