LINUX.ORG.RU

Что почитать C++ программистам

 ,


4

5

Предлагаю вашему вниманию две бесплатные электронные книги. Первая написана мной: «Вредные советы для C++ программистов» (PDF-формат). Это переработанный под печать вариант «60 антипаттернов для С++ программиста». Если вы уже читали 60 антипаттернов, то, пожалуй, читать новый вариант смысла нет. А если нет, то рекомендую — это и возможность местами улыбнуться, и польза.

Теперь про вторую книгу: «Путеводитель C++ программиста по неопределённому поведению». Здесь я был редактором, автор: Дмитрий Свиридкин. Книга опубликована частями, ссылки на которые приведены ниже. Сейчас Дмитрий перерабатывает материал под книжное издание, но это отдельная история.

  1. Часть 1: предисловие, что такое неопределённое поведение, и как оно проявляется, сужающие преобразования и неявное приведение типов.
  2. Часть 2: переполнение целых знаковых чисел, числа с плавающей точкой, integer promotion, char и знаковое расширение.
  3. Часть 3: висячие ссылки, string_view, синтаксический сахар с ложкой дёгтя (range-based for), self-reference, std::vector и инвалидация ссылок.
  4. Часть 4: списки захвата лямбда-функций, кортежи, внезапная мутабельность, неявные ссылки, use-after-move, lifetime extension.
  5. Часть 5: Most Vexing Parse, неконстантные константы, семантика перемещения, std::enable_if_t против std::void_t, забытый return.
  6. Часть 6: эллипсис и функции, operator [], iostreams (счастливой отладки!), оператор запятая, function-try-block, типы «нулевого» размера.
  7. Часть 7: NULL-терминированные строки, std::shared_ptr, (не)явное приведение типов, как передать стандартную функцию и ничего не сломать.
  8. Часть 8: бесконечные циклы и проблема остановки, рекурсия, ложный noexcept, переполнение буфера.
  9. Часть 9: (N)RVO vs RAII, разыменование нулевых указателей, static initialization order fiasco, static inline, нарушение ODR, зарезервированные имена.
  10. Часть 10: тривиальные типы и ABI, неинициализированные переменные, С++20 unbounded ranges, невиртуальные виртуальные функции, VLA.
  11. Часть 11: невалидные указатели, placement new для массивов, data race, повторный захват mutex, сигнало(не)безопасность, как сделать всё правильно и уйти в deadlock.
  12. Часть 12: std::vector::reserve и std::vector::resize, невыровненные ссылки, время жизни и смерти, статический анализ и UB, заключение.

И последнее: если пропустили, в конце 2024 года, как всегда, вышла подборка про самые интересные из найденных нами багов: Топ-10 ошибок в C и C++ проектах за 2024 год.

Мне кажется название темы неудачное - в нём надо как-то отразить что речь не просто про С++, а про баги и UB.

firkax ★★★★★
()

realloc() possible leak: when realloc() fails in allocating memory, original pointer 'hello' is lost. Consider assigning realloc() to a temporary pointer.

Из приведённой цитаты кода совершенно не ясно, что указатель 'hello' не временный. Если ошибкой считается любая строка, где результат записывается туда же, откуда берётся первый аргумент, то это неправильно, надо следить за дальнейшим использованием этой переменной. Например, за первым многоточием можно скрываться hello = context->hello;, а во втором - if(!hello) return;

Переменная level1_table_count по итогу будет вычисляться как 203/41412+1, и при любых значениях переменной true_block будет равна 1.

Судя по комментарию, это не баг. Всё верно - в каждом «фрагменте» есть ровно один L1HASH-блок. А логика расчётов видимо сделана на будущее, когда размер BLOCKS_PER_FILE увеличат.

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

А ещё двусмысленное. Ожидаешь увидеть что-то типа «Чти Страуструпа как отца своего, аминь».

GBV
()

Лысый, ты вернулся!

C++ программистам стоит начать с Евангелия, дабы кресты не просто так были.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.