Обновить
113.37

C *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Демистификация unaligned access undefined behavior в C

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров2.6K

Неопределённое поведение (Undefined Behavior, UB) в C и C++ — одна из причин, по которым разработчики всё чаще ищут языки с полностью определённой семантикой. Одним из самых коварных UB является unaligned access, с точки зрения стандарта C это, например, когда происходит попытка разыменовать указатель как uint32_t, а значение указателя (адрес) не кратно четырём. Один из частых сценариев использования, приводящих к такому UB - получение данных по сети и их интерпретация как чисел.

Читать далее

Почему C стоит учить в 2025 году, особенно если вы изучаете пентест

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров8.7K

Когда речь заходит о выборе языка для начинающего пентестера, чаще всего вспоминают Python: удобный синтаксис, тысячи библиотек, готовые скрипты на GitHub. Но чем глубже вы погружаетесь в безопасность, тем яснее становится: без языка C — никуда.


C не устаревает — он продолжает быть фундаментом всего: от операционных систем до эксплойтов. И вот почему в 2025 году знание C особенно важно для пентеста.

Читать далее

Создание интро в 2кб на Rust за вечер

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров4.4K

В данной статье будет рассказано, как можно довольно просто сделать маленькое интро используя язык Rust. Будет очень много Unsafe и WinAPI кода, а так же предполагается, что читатель уже хоть немного знаком с OpenGL 3.3.

Читать далее

3 кусочка «сахара» к синтаксису языка Lua

Время на прочтение10 мин
Количество просмотров2.9K

Lua — симпатичный и хороший язык — умещает богатый функционал в очень маленькой реализации (интерпретатор и библиотека — это всего один исполнимый файл на 300кб) — и притом изначально ориентирован на «человечный» синтаксис. Хотя он не в топе популярности, но за простоту встраивания (помимо человечности и функциональности) он используется в ряде популярных проектов — от Roblox до Tarantool, например.

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

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

Читать далее

От математики к машине: преобразуем функцию в машинный код

Время на прочтение15 мин
Количество просмотров3.6K

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

1. Математика — чистая математика
2. Haskell — язык для функционального программирования
3. C — язык для императивного программирования
4. Ассемблер — сравнительно удобочитаемое представление машинного кода
5. Машинный код для архитектуры x86-64 — вот это уже интересно

Если вам интересно, какие отличия бывают между языковыми стилями или любопытно, как ваш код может выглядеть после компиляции — добро пожаловать под кат!

Читать далее

Что делать, если ваш слон думает, что он баг?

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров2.5K

Мы окунулись в веб-разработку и нашли там необычное животное. Это был слон с повадками бага. Мы изучили код проекта PHP и поняли, в чём дело. Давайте вместе посмотрим на необычные случаи, которые могут привести к неожиданным результатам.

Читать далее

Ассемблер: рассматриваем каждый байт «Hello, World!». Как на самом деле работают программы на уровне процессора и ОС

Уровень сложностиСредний
Время на прочтение25 мин
Количество просмотров46K

Что на самом деле происходит, когда вы запускаете программу? Мы привыкли воспринимать это как данность, но за кадром скрывается целая вселенная — от регистров процессора и системных вызовов Linux до формата ELF и модели памяти процесса. Присоединяйтесь к погружению, где мы прольём свет на каждый байт программы «Hello, World!» и поймём, каким образом ОС её выполняет.

Читать далее

CPython — сборка мусора изнутри, ч.1

Уровень сложностиСложный
Время на прочтение17 мин
Количество просмотров7.2K

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

Если вам интересно, давайте попробуем разобраться вместе.

Читать далее

Создание своего ядра на C

Уровень сложностиСложный
Время на прочтение25 мин
Количество просмотров28K

В этой статье мы пройдём путь создания простого, но функционального ядра операционной системы на языке C.

Читать далее

ARM MTE и жёсткая память: как сделать С-процессы менее уязвимыми

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров1.1K

Привет, Хабр!

Если вы держали в руках любой крупный C или C++ код, то знаете, что память частенько ошибается . На ARM-системах давно есть TBI, возможность прятать биты в верхнем байте адреса. На этой базе появился Memory Tagging Extension, коротко MTE. Это аппаратная проверка того, что указатель действительно свой для конкретного куска памяти. Часть механизмов есть в ядре Linux, часть в libc, часть в компиляторах, и из этого можно собрать жёсткую память, строгую к факапам и терпимую к продакшен-нагрузке.

MTE добавляет к каждой 16-байтной грануле памяти 4-битный allocation tag. А в верхние биты адреса (59…56) вы добавляете logical tag указателя. Процессор на каждом доступе сравнивает тег указателя и тег памяти. Если не совпало, прилетит fault по выбранному режиму проверки. Гранула фиксированная — 16 байт. Тегов 16. Это значит, что при рандомизации тегов теоретический шанс пронести левый указатель без ошибки — 1 из 16, если атакующий не знает тег. Этот шанс можно давить паттернами тэгирования и дисциплиной работы аллокатора.

Читать далее

Echo сервер на Zig: от потоков к event loop

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров1.8K

Давно присматривался к языку программирования Zig и наконец решил на нём что-то написать. Выбор пал на TCP/UDP echo сервер: задача не слишком сложная, но с интересными моментами, особенно при переходе на event loop. В статье поделюсь процессом и своими впечатлениями.

Читать далее

Вайб-кодинг и реальное программирование на С++

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров14K

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

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

Эта статья - подведение итогов небольшого эксперимента (над собой) по использованию вайб-кодинга в С++ проекте, что для программиста с 30-летним стажем работы стало практически вызовом и серьезным выходом из зоны комфорта. Но сейчас все проблемы решены, и в соответствии с Хабрахаком я решил оформить полученные выводы в письменном виде для их систематизации, а заодно и для получения обратной связи.

Читать далее

Монитор качества воздуха Zigbee своими руками

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров19K

Сразу должен сказать, что идея не моя. Изначально речь шла об устройстве на дисплее epaper, который бы на экран выводил значения CO2, температуру и влажность. Ну еще время. В процессе обсуждения родился проект, который мы назвали Air Quality Monitor.

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

Читать далее

Ближайшие события

Реализация утилиты cat на языке C

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров5.3K

Когда я только начинала изучать язык C, меня довольно сильно пугала его "топорность" по сравнению с другими языками. Все довольно строгое, управляемое вручную, но именно этим он и привлек меня. Потому что ощущение, будто ты напрямую разговариваешь с системой.

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

В статье постараюсь рассказать и показать ход своих мыслей и почему теперь я смотрю на консольные команды совсем иначе. В этой статье я подробно остановлюсь только на реализации утилиты cat.

Что за зверь этот Cat

Cat показалась мне более простой в написании, чем grep, да и частично grep строится на базе cat – тоже читает данные из файла, тоже работает со строками, но с небольшим нюансом в виде фильтрации.

Что нам важно понимать на старте?

Читать далее

CP/M, DOS и их .COMманды

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров2.9K

Небольшое предупреждение! Я буду говорить не просто о том "Как запускаются комманды?", а покажу часть внутреннего мира операционных систем и покажу принципиальную разницу в их работе.

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

Читать далее

Мониторинг CPU + RAM в трее. Часть 2

Уровень сложностиСредний
Время на прочтение20 мин
Количество просмотров2.8K

Я хотел видеть состояние своих CPU и ОЗУ прямо в трее панели задач, чтобы не открывать дополнительные окна, по типу cpuz или CoreTemp. Решил написать свою фоновую программу с возможностью настроек и вот что получилось.

Интересно!

Низкоуровневый АД: пишем ОС. Часть 2 — модули и ввод

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров1.5K

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

Дописывать ОС

Математика, биты, магия и немного ненормального программирования на C

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров12K

Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень), алгоритмах на языке C!

Идея написать эту статью зародилась из моего поста. В нем я рассказал о том, что через последовательность Фибоначчи можно конвертировать мили в километры с небольшой погрешностью. Увидев, что многим понравилась, я задумался: почему бы не изучить еще какие-нибудь трюки, заодно практикуясь в программировании на C?

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

Читать далее

Как ломается RSA512 за 3.5 часа на одном ядре старого ноутбука

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров29K

Сразу оговорюсь, что обычно я не занимаюсь компьютерной безопасностью и не интересуюсь, а занимаюсь алгоритмами и структурами данных - в прикладном применении это оптимизация быстродействия, высокопроизводительные вычисления типа CUDA, AVX512, многопоточность, что применяется например для майнеров криптовалют. Так я влез в криптанализ, ибо области, получается, соприкасаются. Был у меня заказ от человека, который хотел очень быстро на видеокартах перемножать 256-битные числа в 512-битные произведения. Я конечно сделал как он хотел, но вот пришла идея: так а зачем перемножать безчисленное количество чисел, если в принципе можно разложить на множители 512-битное число имея текущие технологии? Об этом дальше и речь.

Дано:

Читать далее

Волшебство ООП или как упростить многопоточное программирование C++

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров5.9K

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

Читать далее

Вклад авторов