Как стать автором
Обновить
99.1

C *

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

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

Ложные убеждения о нулевых указателях

Время на прочтение10 мин
Количество просмотров6.6K
В этой статье предполагается, что вы знаете, что такое неопределённое поведение, и почему его не следует провоцировать, в самом общем виде знаете, как работают процессоры, а также умеете принимать во внимание конкретный контекст, не злоупотребляя излишним обобщением частностей. Эти убеждения можно считать заблуждениями, так как они не применяются глобально, а не потому, что обратное от них действует глобально. Если вы не уверены в себе, то, возможно, от прочтения этого текста вы больше проиграете, тем самым подпортив себе навыки программной инженерии. Поэтому ничего страшного, если вы не будете знакомиться с постом, а просто почитаете комментарии на Reddit — там уже написали, что может пойти не так, если вы, несмотря ни на что, углубитесь в этот материал.

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

[Hello, Habr!] Змейка в консоли. Разбираемся с с make и gcc

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

Всем привет! Это моя первая публикация на хабре и я решил посвятить её тому, как я писал змейку в консоли (да коряво, но всё же).

Итак, зачем я её вообще затеял? Я просто хотел разобраться как работать с make и gcc и для примера решил написать змейку в консоли ¯\_(ツ)_/¯

Я написал самый обыкновенный makefile, в подробности его устройства вникать не будем. Просто покажу код.

Читать далее

Где твои системные вызовы?

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

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

Если вы программируете на C — всё это делается автоматически. Поэтому мы будем писать код только на языке, который совершенно нельзя назвать C, и при этом обойдёмся без линковки с libc.

Читать далее

Пишем HTTP-сервер на чистом C

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

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

Сегодня будем писать HTTP-сервер на C. Если когда-нибудь вас заставят написать сервер без libcurl, boost::asio или microhttpd, вы будете готовы.

Читать далее

Как malloc() и free() управляют памятью в C

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

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

Сегодня рассмотрим, почему free() не всегда освобождает память, как работает malloc(), когда glibc действительно возвращает память в ОС, и как избежать фрагментации хипа. А так же напишем кастомный аллокатор.

Читать далее

Лучшие Образцы Си Кода

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

Я долгое время негодовал по поводу того, что часто приходится копаться в бесплатном плохо оформленном open-source коде из интернета.

Но теперь я решил сделать рефрейминг. Отныне я коллекционирую такие куски кода! Да. Теперь каждая причудливая функция приносит мне искреннюю радость так, как пополняет ценнейшую коллекцию того, как не надо делать.

Читать далее

std::array в С++ быстрее массива в С. Иногда

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

Давайте натрём наши болиды до блеска и посмотрим, как они входят в повороты компиляторных оптимизаций на примере использования std::array. Смогут ли они не только не уступить, но и обогнать встроенный массив?

Поехали!

Syscall и cgo в Go

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

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

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

Читать далее

Учимся рефакторить код на примере багов в TDengine, часть 1: про колбасу

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

колбасный код
Проверяя код проекта TDengine с помощью PVS-Studio, можно встретить канонические ошибки и опечатки. Многих из них можно избежать, если изначально аккуратно оформлять код, делать логику простой и избегать макросов. Давайте посмотрим на эти ошибки и подумаем, как можно повести рефакторинг кода так, чтобы им просто не было там места.

Читать дальше →

MicroPython на STM32F4xx на собственной печатной плате. Ч.1. Погружение в MicroPython и его возможности

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

Добрый день, друзья!

Это моя первая статья на Хабр да и вообще где-либо поэтому жду от вас полезных комментариев для заполнения пробелов в своих навыках и знаниях. В этой статье попытаюсь подробно указать/рассказать, как я запустил MicroPython на микроконтроллере STM32F411RET6.

Читать далее

Пишем обертку для сборки OpenSSL на CMake

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

Столкнулся я с ситуацией, в которой нужно было собирать OpenSSL под разные операционные системы и архитектуры процессоров. В сумме насчитывается 5 сборок.

Главной проблемой сборки OpenSSL выступает система сборки - Autotools, ее сложно интегрировать в CMake. В данной статье рассмотрим как приложив минимальное количество усилий перенести сборку OpenSSL на CMake.

Читать далее

Эффективное межпроцессное взаимодействие с использованием IPC и Shared Memory

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

В данной статье рассматривается использование механизма разделяемой памяти (shared memory) для эффективной передачи данных между независимыми процессами в рамках одной машины. Цель статьи — продемонстрировать не только базовые принципы работы с разделяемой памятью, но и показать, как размещать в ней высокоуровневые контейнеры, такие как хеш-таблицы (unordered_map), а также рассмотреть практический пример потоковой обработки данных при помощи кольцевого буфера.

Читать далее

Что нового в IMSProg в 2025 году?

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

В октябре 2024 года я описал историю создания программатора микросхем CH341a для Linux систем. Год назад я рассказал о дополнительных возможностях программы, появившихся позднее. Давайте посмотрим, что изменилось в программе за год.

Читать далее

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

Как код С выполняется на процессоре ARM: разбор ассемблера

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

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

Читать далее

Начальное ускорение математики

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

Всем привет. В графических приложениях есть своего рода сердце — этой графики. Это математика, от того как исполнена математика, зависит общий отклик приложения, есть некоторые подходы, при помощи которых не сразу, но можно войти в начальное понимание, как и что ускорять.

В этой статье хочу показать как я почти в 10 раз ускорил графику при помощи математики.

Читать далее

Эмулятор NES в каждый проект! [0x02]

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

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

Читать далее

Самые Эпичные Баги при Программировании Микроконтроллеров

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

У каждого программиста микроконтроллеров с годами кристаллизируется коллекция золотых багов. Некоторые из них весьма эпичные.

Самый типичный баг - это зависание прошивки.

Выявление причин багов и их устранение порой сродни работы детективом. Это проявляется в том, что порой очень трудно выявить причину бага. Сначала разработчик идет по ложному следу, ходит кругами, а в конце-концов выясняется, что причина на самом деле была проста, как солдатский валенок.

Читать далее

Типичные ошибки в Си: как их избежать и писать надёжный код

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

Типичные ошибки в Си: как их избежать и писать надёжный код

Вы устали от:
❌ Тайных утечек памяти, которые пожирают ресурсы.
❌ Загадочных падений программы без объяснения причин.
❌ Указателей-призраков, стреляющих в вас из темноты сегфолтов.

Эта статья — ваш щит и меч:
✅ Примеры кода, которые покажут, где прячутся ошибки.
✅ Практические советы для мгновенного улучшения кода.
✅ Инструменты-спасатели (Valgrind, Cppcheck).

🛠 «Если ваш код на Си работает — это чудо. Сделайте так, чтобы это было закономерностью».

Для кого:
• Начинающие разработчики, которые хотят писать код, а не баги.
• Те, кто считает, что free() — это про свободу, а не про память.
• Все, кто устал гуглить «почему Си опять вылетает».

Погружаемся

Когда кажется, что нашёл баг в компиляторе

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

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

Читать далее

В преддверии испытаний статических анализаторов под руководством ФСТЭК России

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

Испытания статических анализаторов исходных кодов компилируемых и динамических языков программирования под руководством ФСТЭК России


В 2024 году вышел ГОСТ Р 71207 — Статический анализ программного обеспечения. Однако пользователям анализаторов сложно определять, насколько тот или иной инструмент соответствует критериям, изложенным в стандарте. Поэтому ФСТЭК России в 2025 году организует испытания статических анализаторов, результаты которых будут опубликованы в конце года. Ближайший этап — это выработка критериев оценки, и я решил предварительно изложить некоторые мысли по этой теме, которые, возможно, будут интересны жюри и участникам.

Читать дальше →

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

Работа

Программист С
36 вакансий