15720
Присоединяйтесь к нашему каналу и погрузитесь в мир для C/C++-разработчика Связь: @devmangx РКН: https://clck.ru/3Foc4d
Выглядит чертовски интересно. Добавляю в список чтения на выходные!
https://www.dmurph.com/posts/2026/06/ecs_vs_oop_benchmark/ecs_vs_oop_benchmark.html
👉 @Cpportal
Давайте возьмём детей в продуктовый магазин, чтобы выяснить!
http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html
👉 @Cpportal
Python: _ = ignored()
Rust: let _ = ignored();
Go: _, err := call()
В C++ до сих пор приходилось давать имя каждой переменной — даже той, которую вы сразу же отбрасываете.
Предложение P2169, вошедшее в C++26, добавляет placeholder-переменные. Теперь для игнорирования любой привязки можно использовать _: в structured bindings, captures и init-statements.
Можно использовать несколько _ в одной области видимости — конфликта имен не возникнет.
Больше никаких предупреждений компилятора. Никаких костылей вроде (void)unused;.
Просто _.
Авторы: Corentin Jabot и Michael Park.
👉 @Cpportal
В C порядок вычисления аргументов функции не определён. gcc вычисляет их справа налево, clang — слева направо. Раньше это было источником хитрых багов, сейчас это обычно ловит флаг -Wall.
Каждый раз, когда вижу такое, думаю, можно ли это как-то использовать на практике.
Например, если ты DLL, которую подгружают динамически, можно попробовать на рантайме угадать, каким компилятором собран исполняемый файл — через этот эффект и ещё пару эвристик. Где-то это наверняка можно применить.
👉 @Cpportal
ОДИН ИЗ САМЫХ ВОСТРЕБОВАННЫХ НАВЫКОВ СЕЙЧАС — РЕВЕРС-ИНЖИНИРИНГ
Для этого не нужен исходный код программы.
Берёте бинарный файл.
Преобразуете его в ассемблерный код.
Разбираете его функцию за функцией.
Извлекаете заложенную в нём логику.
Это и называется реверс-инжинирингом.
С помощью этого метода:
• Была предотвращена кибератака с ущербом в 4 млрд долларов
• Был раскрыт секретный арсенал киберинструментов АНБ
• Были взломаны 3 миллиона гостиничных электронных замков
• Страны копировали истребители друг друга
Сейчас объясню техническую сторону, расскажу об инструментах и покажу реальные примеры.
Есть два основных подхода.
Статический анализ: вы изучаете бинарный файл без запуска программы, преобразуя его в ассемблерный код.
Динамический анализ: вы запускаете программу в контролируемой среде, отслеживаете её поведение во время выполнения и вызовы API.
На практике оба подхода используются вместе.
1. Инструменты:
- Ghidra — бесплатный инструмент с открытым исходным кодом, отлично подходит для начинающих.
- IDA Pro — отраслевой стандарт, стоит около $2000 (доступна бесплатная лайт-версия).
- x64dbg — отладчик для Windows-бинарников.
- GDB + pwndbg — стандартная связка для Linux.
- Radare2 — мощный терминальный инструмент, но с высоким порогом входа.
2. Что нужно знать перед началом:
- Большая часть декомпилированного кода программ на C остаётся кодом на C.
- Ассемблер x86-64: регистры, стек, базовые инструкции.
- Основы ОС: процессы, организация памяти, форматы ELF и PE.
Без этих трёх вещей даже открыв инструменты, вы вряд ли поймёте, что происходит.
3. Платформы для практики:
- crackmes.one — задания разных уровней сложности, самый простой вход для новичков.
- picoCTF — архив соревнований Carnegie Mellon с хорошей кривой сложности.
- pwn.college — бесплатная структурированная программа обучения.
- Hack The Box — уровень от среднего до продвинутого.
В этой сфере побеждает не тот, у кого IQ 150, а тот, кто умеет распознавать закономерности. Всё начинается с простой программы на C из трёх строк. Напишите её, скомпилируйте и разберите.
Посмотрите, как эти три строки превращаются в десятки машинных инструкций. Такой цикл обратной связи учит быстрее всего.
План для старта:
→ Изучите ассемблер x86 по курсу OpenSecurityTraining2.
→ Установите Ghidra и разберите собственный код.
→ Затем переходите по цепочке: crackmes.one → picoCTF → pwn.college → Hack The Box.
Это направление требует времени. Первые несколько месяцев будут непростыми. Потом вы начнёте смотреть на программные системы совершенно иначе.
Ставь лайк, если пост был как всегда огненным 🐸
👉 @Cpportal
До C++20 реализация эффективных condition variables означала обёртку вокруг OS-level futex или pthread_cond.
C++20 добавил wait и notify напрямую в std::atomic, позволяя компилятору отображать их на самый быстрый примитив ОС без оверхеда мьютекса.
👉 @Cpportal
offsetof() возвращает смещение члена структуры в байтах на этапе компиляции.
В старых реализациях это работало за счёт приведения 0 к указателю на структуру и взятия адреса одного из её членов.
Выглядит как разыменование нулевого указателя, но на самом деле никакого доступа к памяти не происходит.
Ядро Linux строит container_of() поверх этой идеи.
Небольшой макрос, на котором основана огромная часть связанных списков и структур данных ядра.
👉 @Cpportal
int x;
std::cout << x;
Народ!! Пишем malloc() с нуля на x86 Assembly
https://youtu.be/3gNa4EUti8A
А это внутренности malloc -
https://sourceware.org/glibc/wiki/MallocInternals
👉 @Cpportal
На сессии — живой урок от Benj Dicken по perf!!
Бен вкладывает много сил в преподавание каждой главы из этой потрясающей книги. Используйте эту возможность по максимуму.
Обожаю эти занятия от Бена 🐸
👉 @Cpportal
Мой племянник учится на втором курсе программной инженерии. Позвонил недавно, попросил помочь с поиском стажировки. И среди прочего спросил, где лучше разобраться с Git. Я удивился. На втором курсе студенты всё ещё обходят Git стороной. А потом это бьёт по ним на собеседованиях.
Я посоветовал ему отличный гайд от Beej.
Он перезвонил сегодня. Полный восторга. Делился впечатлениями. Так что вот, снова рекомендую. Для всех студентов и всех, кто только начинает знакомство с Git.
https://beej.us/guide/bggit/
👉 @Cpportal
Бро написал библиотеку для работы со строками на чистом C. Рассказ, как и зачем.
Вот содержание.
00:00 — Введение
00:15 — Зачем это понадобилось
02:26 — Первый подход: строки через struct
05:16 — Второй подход: строки в стиле Pascal
06:50 — Сравнение подходов
10:20 — Особенности single-header библиотеки
11:30 — Обзор реализации библиотеки
15:05 — Разбиение строк (string splitting)
23:50 — Разбор реализаций в musl и glibc
27:13 — Итоги и выводы
https://youtu.be/DhOJ1KINUdU?si=5AkX8CmWEtuAEBMm
👉 @Cpportal
Большинство людей думают, что процессор работает напрямую с оперативной памятью.
Но это не так.
CPU крайне редко выполняет вычисления непосредственно над данными в RAM.
Основная работа происходит внутри регистров.
RAM → Регистр → АЛУ → Регистр → RAM
Если ты когда-то хотел зайти в reverse engineering, но не понимал, с чего начать — эта серия выглядит как один из самых внятных бесплатных входов.
Applied Reverse Engineering от daaximus разбирает базу: архитектура, стек, исключения и прерывания, x64 ассемблер, трассировка потока управления. Дальше обещают перейти к хукам, ROP, эвристическому анализу и восстановлению C++ классов.
Материал сделан для тех, кто открывал отладчик пару раз и быстро терялся. Начинается с нуля и не разваливается на полпути.
https://revers.engineering/applied-reverse-engineering-series/
👉 @Cpportal
Этот простой код на C содержит известную уязвимость, которая в 1980-х вывела из строя около 10% интернета.
Можете определить, в чём здесь проблема?
Осознание того, насколько небезопасной с точки зрения кибербезопасности может быть стандартная библиотека C, привело к её пересмотру начиная с 1990-х годов. Проблема оказалась настолько серьёзной, что её источник впоследствии полностью убрали из стандарта C.
👉 @Cpportal
Ты скачал файл, но не можешь вспомнить, куда его сохранил.
Выполни:
find ~ -name "имя_файла"
Например:
find ~ -name "config_old.txt"
Это пошлёт поиск в домашней директории и покажет, где находится файл.
Замени notes.txt на имя файла, который ищешь, например:
find ~ -name "report.pdf"
find ~ -name "photo.jpg"
find ~ -name "http://backup.zip"
find ~ -name "http://script.sh"
find ~ -name "config.yml"
👉 @Cpportal
⚡️ПОСЛЕДНИЙ ДЕНЬ АКЦИИ ЖАРКОЕ ЛЕТО
Таких условий больше не будет
🟦Диплом установленного образца (Системный администратор) - это не просто сертификат о прохождении, это официальный документ, который открывает двери в корп-сегмент и гарантирует железобетонный фундамент в Linux.
🟦Полная база пентеста (Red & Blue Team) - от сканирования инфраструктуры до сложных атак на Active Directory и веб-уязвимостей. Вы начинаете думать и действовать как профессиональный хакер.
🟦Взлом баз данных - глубокое понимание SQL-инъекций и архитектуры БД, чтобы доставать самые ценные активы компаний.
🟦AI-помощники на Python - автоматизация всей рутины. Пока другие работают руками, ваши ИИ-агенты парсят уязвимости и пишут отчеты, умножая ваш чек и скорость.
В C++26 стандартный in-place vector способен хранить в непрерывной области памяти объекты типов, которые нельзя перемещать, нельзя копировать и которые не имеют конструктора по умолчанию.
👉 @Cpportal
delete-with-reason из C++26 — довольно полезная штука
Помогает документировать, почему тот или иной метод удалён из класса.
https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2573r2.html#motivation
👉 @Cpportal
Linux наконец избавился от strncpy. На это ушло шесть лет, 362 патча и 70 разработчиков.
История 40-летней функции C, которая выглядела безопасной, но на самом деле такой не была, и масштабной работы по её полному удалению из кодовой базы ядра.
Ссылка на статью: https://open.substack.com/pub/chessman7/p/linux-finally-killed-strncpy-it-took?r=l7k4t
В Linux 7.2 функция strncpy была официально удалена из ядра. Её не объявили устаревшей, не стали выводить предупреждения и не ограничились рекомендациями не использовать её в документации. Её просто удалили.
Из дерева исходного кода удалили саму реализацию функции, включая все оптимизированные версии для разных архитектур процессоров. Если теперь написать код ядра, который пытается вызвать strncpy, компилятор просто отклонит такую сборку. И точка.
👉 @Cpportal
Потратив полдня, последовательно отключая части кода во всей кодовой базе stim, чтобы найти причину нарушения доступа, которое внезапно появилось в Windows-сборках GitHub CI.
Похоже, это баг компилятора. На Ubuntu всё работает корректно (t = 2), а на Windows выводится t = 8589934594 (0x200000002 в шестнадцатеричном виде).
Удалось воспроизвести проблему в Godbolt.
Разработчик попытался сообщить об этом в Microsoft, но их сайт для отправки баг-репортов тоже оказался сломан.
Он не принимает GitHub-аккаунт (из-за того, что к нему привязан адрес Gmail 🤦), а капча с требованием «нажмите и удерживайте» при создании учётной записи вообще не работает.
Да ну его. Пусть компилятор так и остаётся с этим багом.
👉 @Cpportal
std::inplace_vector (P0843) в C++26 — динамически изменяемый по размеру вектор с фиксированной на этапе компиляции вместимостью и встроенным хранилищем. Никогда не использует кучу.
Поддерживает constexpr. Можно использовать как готовую замену в горячих участках кода, где выделение памяти запрещено.
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p0843r14.html
👉 @Cpportal
Оператор # в препроцессоре C превращает токены в строковые литералы на этапе компиляции — никакого преобразования во время выполнения.
В ядре Linux этот трюк используется в макросах вроде WARN_ON(), чтобы вывести точное условие, которое не сработало.
Написал выражение один раз — препроцессор сам генерирует соответствующую строку.
Один оператор — и ваши отладочные сообщения всегда синхронизированы с кодом.
👉 @Cpportal
C++ возглавил рейтинг производительности в проекте GitHub Primes.
Автор отметил, что его решение на C++ сейчас занимает первое место в таблице лидеров. Проект сравнивает реализацию одного и того же алгоритма решета на 100 языках — от Ada до Zig, включая необычные варианты вроде PowerShell и Minecraft.
В тесте действуют строгие правила. На каждый элемент решета выделяется один бит, а сам массив создаётся заново при каждом проходе. Это нужно, чтобы выровнять условия между языками с разной моделью памяти и исполнения.
После последнего обновления C++-реализация немного обошла версию на ассемблере. Разница минимальная и может укладываться в погрешность, поэтому автор ищет дальнейшие оптимизации.
Проект остаётся открытым для сравнения производительности разных языков программирования.
👉 @Cpportal
Большинство инженеров проваливают CUDA не потому что это сложно. А потому что читают правильные книги в неправильном порядке.
У CUDA репутация вещи, которая ломает людей. Стандартный совет «просто прочти PMPP» бросает новичка в самую глубокую книгу в теме. А потом удивляются, почему он сдаётся к четвёртой главе.
С книгой всё в порядке. Проблема в последовательности. Я перебрал всю полку и вот порядок, который реально работает. Каждая книга подготавливает к следующей.
CUDA by Example (Sanders & Kandrot) — не учись ядрам. Учись чувствовать GPU. Это даёт интуицию, которую каждая следующая книга считает уже заложенной.
Programming Massively Parallel Processors (Hwu, Kirk, El Hajj) — фундамент. Здесь строится ментальная модель: треды, блоки, параллельные паттерны. Теперь она ложится нормально, потому что первая книга дала крючки.
Professional CUDA C Programming (Cheng, Grossman, McKercher) — архитектура. Иерархия памяти, стримы и причины каждого performance-клифа, в который ты врежешься.
GPU Programming with C++ and CUDA (Motta) — современный воркфлоу. Профилирование в Nsight, полный цикл разработки, упаковка ядер в библиотеки, которые можно дёргать из Python.
The CUDA Handbook (Wilt) — справочник, в который дорастаешь. Его не читают от корки до корки. К нему тянутся, когда «на моей машине работает» перестаёт быть достаточным.
CUDA for Deep Learning (Arledge) — пейофф. Когда ядра перестают быть упражнением и начинают ускорять модели, которые ты реально выкатываешь.
Схема общая для всех шести: интуиция до теории, теория до архитектуры, архитектура до применения.
Большинство бросает на неправильной книге. Почти никто не бросает из-за порядка. Потому что никто не сказал, что порядок — это и есть главное.
👉 @Cpportal
Я всё чаще думаю о выразительности в инженерии.
Почти любую идею можно запрограммировать, но расплачиваешься многословием. Необязательно бросать язык. Можно пересмотреть строительные блоки.
Вместо того чтобы собирать библиотеки и сшивать их вручную, можно собрать инструменты, которые собирают библиотеки, а потом сшить их. Просто и эффективно для конечного пользователя. Без ущерба для языка.
Я начал проектировать утилиту для Linux и сразу утонул в конфигурационном шаблоне. Переменные окружения, флаги, какой источник главнее, что что переопределяет.
Я мог описать нужный конфиг в несколько предложений, но на практике это вылилось в кучу Go. Go тут ни при чём. Проблема в пути, который идея проходит от замысла до машинного кода.
Я экспериментирую с генераторами кода, которые убивают шаблон без акробатики с метапрограммированием.
Вдохновение — protobuf, которым я пользуюсь каждый день в Google. Можно написать универсальный API для сериализации структур, но DSL со схемой плюс генерация кода делают то же самое проще и быстрее. Проверенная идея. Инженеры здесь шутят, что их работа — просто перекладывать protobuf'ы туда-сюда.
Ниже наброски эксперимента. С одной стороны декларативная спецификация на Starlark. С другой — полная Go-библиотека для конфига, в которую она разворачивается.
👉 @Cpportal
В 1998 году Microsoft проводила живую демонстрацию Windows 98 на сцене.
Чтобы показать поддержку USB, к компьютеру подключили сканер.
Сразу после этого система выдала «синий экран смерти» прямо перед зрителями и Bill Gates.
Он лишь улыбнулся и сказал:
«Наверное, именно поэтому мы ещё не выпустили Windows 98.»
Когда ты вычисляешь:
5 + 3
Father’s Day Project Based Tutorials in C.
Практические туториалы по C, построенные вокруг проектов.
От компьютерной архитектуры до разработки игр и внутреннего устройства ОС — всё через практическую сборку.
Подходит как входная точка, если учишь язык и хочешь опираться на конкретные задачи, а не на абстракции.
https://github.com/7etsuo/project-based-tutorials-in-c
👉 @Cpportal
Циклы в assembly выглядят пугающе, пока не понимаешь одну вещь
В assembly цикл — это просто метка и прыжок назад.
Хочешь вывести 1 2 3 4 5 6 7 8 9 10?
Ты заводишь счётчик, печатаешь символ, увеличиваешь значение и делаешь loop обратно на метку.
Никакой магии из for, while и синтаксического сахара.
Просто:label → действие → decrement → jump назад
После этого высокоуровневые циклы начинают выглядеть как удобная обёртка над очень простой идеей.
👉 @Cpportal