cpportal | Unsorted

Telegram-канал cpportal - С/С++ Portal | Программирование

15720

Присоединяйтесь к нашему каналу и погрузитесь в мир для C/C++-разработчика Связь: @devmangx РКН: https://clck.ru/3Foc4d

Subscribe to a channel

С/С++ Portal | Программирование

Выглядит чертовски интересно. Добавляю в список чтения на выходные!

https://www.dmurph.com/posts/2026/06/ecs_vs_oop_benchmark/ecs_vs_oop_benchmark.html

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Давайте возьмём детей в продуктовый магазин, чтобы выяснить!

http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

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

Читать полностью…

С/С++ Portal | Программирование

В C порядок вычисления аргументов функции не определён. gcc вычисляет их справа налево, clang — слева направо. Раньше это было источником хитрых багов, сейчас это обычно ловит флаг -Wall.

Каждый раз, когда вижу такое, думаю, можно ли это как-то использовать на практике.
Например, если ты DLL, которую подгружают динамически, можно попробовать на рантайме угадать, каким компилятором собран исполняемый файл — через этот эффект и ещё пару эвристик. Где-то это наверняка можно применить.

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

ОДИН ИЗ САМЫХ ВОСТРЕБОВАННЫХ НАВЫКОВ СЕЙЧАС — РЕВЕРС-ИНЖИНИРИНГ

Для этого не нужен исходный код программы.

Берёте бинарный файл.
Преобразуете его в ассемблерный код.
Разбираете его функцию за функцией.
Извлекаете заложенную в нём логику.

Это и называется реверс-инжинирингом.

С помощью этого метода:
• Была предотвращена кибератака с ущербом в 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

Читать полностью…

С/С++ Portal | Программирование

До C++20 реализация эффективных condition variables означала обёртку вокруг OS-level futex или pthread_cond.

C++20 добавил wait и notify напрямую в std::atomic, позволяя компилятору отображать их на самый быстрый примитив ОС без оверхеда мьютекса.

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

offsetof() возвращает смещение члена структуры в байтах на этапе компиляции.

В старых реализациях это работало за счёт приведения 0 к указателю на структуру и взятия адреса одного из её членов.

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

Ядро Linux строит container_of() поверх этой идеи.

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

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

int x;
std::cout << x;


В C++23 такой код приводит к неопределённому поведению (undefined behavior). Компилятор вправе сделать что угодно: от вывода случайного значения до любых оптимизаций, основанных на предположении, что такого кода не существует.

В C++26 всё меняется. Достаточно перекомпилировать проект с новым стандартом.

Предложение P2795 устраняет неопределённое поведение при чтении неинициализированных значений. Вместо него вводится новый термин — erroneous behavior («ошибочное поведение»). Теперь значение считается определённым (обычно это будет ноль), а компилятор может выдать предупреждение.

Менять код не нужно. Достаточно пересобрать проект в режиме C++26 — и целый класс подобных ошибок перестанет приводить к неопределённому поведению.
Thomas Köppe

https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2795r5.html

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Народ!! Пишем malloc() с нуля на x86 Assembly

https://youtu.be/3gNa4EUti8A

А это внутренности malloc -

https://sourceware.org/glibc/wiki/MallocInternals

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

На сессии — живой урок от Benj Dicken по perf!!

Бен вкладывает много сил в преподавание каждой главы из этой потрясающей книги. Используйте эту возможность по максимуму.

Обожаю эти занятия от Бена 🐸

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Мой племянник учится на втором курсе программной инженерии. Позвонил недавно, попросил помочь с поиском стажировки. И среди прочего спросил, где лучше разобраться с Git. Я удивился. На втором курсе студенты всё ещё обходят Git стороной. А потом это бьёт по ним на собеседованиях.

Я посоветовал ему отличный гайд от Beej.

Он перезвонил сегодня. Полный восторга. Делился впечатлениями. Так что вот, снова рекомендую. Для всех студентов и всех, кто только начинает знакомство с Git.

https://beej.us/guide/bggit/

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Бро написал библиотеку для работы со строками на чистом 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

Читать полностью…

С/С++ Portal | Программирование

Большинство людей думают, что процессор работает напрямую с оперативной памятью.
Но это не так.

CPU крайне редко выполняет вычисления непосредственно над данными в RAM.
Основная работа происходит внутри регистров.

RAM → Регистр → АЛУ → Регистр → RAM


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

#CPU #ComputerArchitecture #Registers #RISCV #Linux #Hardware

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Если ты когда-то хотел зайти в reverse engineering, но не понимал, с чего начать — эта серия выглядит как один из самых внятных бесплатных входов.

Applied Reverse Engineering от daaximus разбирает базу: архитектура, стек, исключения и прерывания, x64 ассемблер, трассировка потока управления. Дальше обещают перейти к хукам, ROP, эвристическому анализу и восстановлению C++ классов.

Материал сделан для тех, кто открывал отладчик пару раз и быстро терялся. Начинается с нуля и не разваливается на полпути.

https://revers.engineering/applied-reverse-engineering-series/

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Этот простой код на C содержит известную уязвимость, которая в 1980-х вывела из строя около 10% интернета.

Можете определить, в чём здесь проблема?

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

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

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

Выполни:

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

Читать полностью…

С/С++ Portal | Программирование

⚡️ПОСЛЕДНИЙ ДЕНЬ АКЦИИ ЖАРКОЕ ЛЕТО

Таких условий больше не будет


Пора принимать решение. Вы можете дальше откладывать свое развитие на "когда-нибудь", а можете прямо сегодня забрать все необходимые для старта навыки и диплом установленного образца всего за 50 000 ₽ вместо 250 000 ₽

Забронировать место▶️@cyacademy_support

Пять фундаментальных программ. Официальная профессия. Полный боевой арсенал. И всё это по цене 10 000₽ за каждый блок. Никто на рынке ИБ не отдает такой объем хард-скиллов за такие деньги:
🟦Диплом установленного образца (Системный администратор) - это не просто сертификат о прохождении, это официальный документ, который открывает двери в корп-сегмент и гарантирует железобетонный фундамент в Linux.
🟦Полная база пентеста (Red & Blue Team) - от сканирования инфраструктуры до сложных атак на Active Directory и веб-уязвимостей. Вы начинаете думать и действовать как профессиональный хакер.
🟦Взлом баз данных - глубокое понимание SQL-инъекций и архитектуры БД, чтобы доставать самые ценные активы компаний.
🟦AI-помощники на Python - автоматизация всей рутины. Пока другие работают руками, ваши ИИ-агенты парсят уязвимости и пишут отчеты, умножая ваш чек и скорость.

🟪SQL для хакера | Linux CyberPunk | HackerPoint 1 и 2 | AI-помощники на
Python

👉 Забрать весь арсенал и Диплом прямо сейчас: @cyacademy_support

Читать полностью…

С/С++ Portal | Программирование

В C++26 стандартный in-place vector способен хранить в непрерывной области памяти объекты типов, которые нельзя перемещать, нельзя копировать и которые не имеют конструктора по умолчанию.

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

delete-with-reason из C++26 — довольно полезная штука

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

https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2573r2.html#motivation

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

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

Читать полностью…

С/С++ Portal | Программирование

Потратив полдня, последовательно отключая части кода во всей кодовой базе stim, чтобы найти причину нарушения доступа, которое внезапно появилось в Windows-сборках GitHub CI.

Похоже, это баг компилятора. На Ubuntu всё работает корректно (t = 2), а на Windows выводится t = 8589934594 (0x200000002 в шестнадцатеричном виде).

Удалось воспроизвести проблему в Godbolt.

Разработчик попытался сообщить об этом в Microsoft, но их сайт для отправки баг-репортов тоже оказался сломан.

Он не принимает GitHub-аккаунт (из-за того, что к нему привязан адрес Gmail 🤦), а капча с требованием «нажмите и удерживайте» при создании учётной записи вообще не работает.

Да ну его. Пусть компилятор так и остаётся с этим багом.

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

std::inplace_vector (P0843) в C++26 — динамически изменяемый по размеру вектор с фиксированной на этапе компиляции вместимостью и встроенным хранилищем. Никогда не использует кучу.

Поддерживает constexpr. Можно использовать как готовую замену в горячих участках кода, где выделение памяти запрещено.

https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p0843r14.html

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Оператор # в препроцессоре C превращает токены в строковые литералы на этапе компиляции — никакого преобразования во время выполнения.

В ядре Linux этот трюк используется в макросах вроде WARN_ON(), чтобы вывести точное условие, которое не сработало.

Написал выражение один раз — препроцессор сам генерирует соответствующую строку.

Один оператор — и ваши отладочные сообщения всегда синхронизированы с кодом.

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

C++ возглавил рейтинг производительности в проекте GitHub Primes.

Автор отметил, что его решение на C++ сейчас занимает первое место в таблице лидеров. Проект сравнивает реализацию одного и того же алгоритма решета на 100 языках — от Ada до Zig, включая необычные варианты вроде PowerShell и Minecraft.

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

После последнего обновления C++-реализация немного обошла версию на ассемблере. Разница минимальная и может укладываться в погрешность, поэтому автор ищет дальнейшие оптимизации.

Проект остаётся открытым для сравнения производительности разных языков программирования.

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Большинство инженеров проваливают 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

Читать полностью…

С/С++ Portal | Программирование

Я всё чаще думаю о выразительности в инженерии.

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

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

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

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

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

Вдохновение — protobuf, которым я пользуюсь каждый день в Google. Можно написать универсальный API для сериализации структур, но DSL со схемой плюс генерация кода делают то же самое проще и быстрее. Проверенная идея. Инженеры здесь шутят, что их работа — просто перекладывать protobuf'ы туда-сюда.

Ниже наброски эксперимента. С одной стороны декларативная спецификация на Starlark. С другой — полная Go-библиотека для конфига, в которую она разворачивается.

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

В 1998 году Microsoft проводила живую демонстрацию Windows 98 на сцене.
Чтобы показать поддержку USB, к компьютеру подключили сканер.

Сразу после этого система выдала «синий экран смерти» прямо перед зрителями и Bill Gates.
Он лишь улыбнулся и сказал:

«Наверное, именно поэтому мы ещё не выпустили Windows 98.»


Этот момент стал одним из самых известных провалов в истории технологических презентаций. Позже видео с демонстрацией разошлось по всему интернету и превратилось в классический мем про Windows.

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Когда ты вычисляешь:

5 + 3


Процессор НЕ обращается к оперативной памяти за числами 5 и 3 при каждой операции.

Вместо этого происходит следующее:
Загружается 5 в один регистр
Загружается 3 в другой регистр
АЛУ (арифметико-логическое устройство) выполняет сложение
Результат сохраняется в регистре
В память результат записывается позже, когда это потребуется

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

#ComputerScience #CPU #Registers

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Father’s Day Project Based Tutorials in C.

Практические туториалы по C, построенные вокруг проектов.
От компьютерной архитектуры до разработки игр и внутреннего устройства ОС — всё через практическую сборку.
Подходит как входная точка, если учишь язык и хочешь опираться на конкретные задачи, а не на абстракции.

https://github.com/7etsuo/project-based-tutorials-in-c

👉 @Cpportal

Читать полностью…

С/С++ Portal | Программирование

Циклы в assembly выглядят пугающе, пока не понимаешь одну вещь

В assembly цикл — это просто метка и прыжок назад.

Хочешь вывести 1 2 3 4 5 6 7 8 9 10?
Ты заводишь счётчик, печатаешь символ, увеличиваешь значение и делаешь loop обратно на метку.
Никакой магии из for, while и синтаксического сахара.

Просто:
label → действие → decrement → jump назад

После этого высокоуровневые циклы начинают выглядеть как удобная обёртка над очень простой идеей.

👉 @Cpportal

Читать полностью…
Subscribe to a channel