Обновить
98.14

C *

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

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

Учимся рефакторить код на примере багов в TDengine, часть 2: макрос, пожирающий стек

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

Макрос пожирает стек


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

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

Переносимый код: Fighting the Lemmings

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

Сергей Каличев, старший разработчик, Angie Software

Однажды, давным-давно, я наткнулся на одну хорошую статью по разработке переносимого кода и решил её перевести. Когда же это было... ё-моё, в 2008 году, 17 лет назад! Обалдеть, как время летит. Статья называлась "Fighting the Lemmings", автор Martin Husemann. Выложил перевод на LOR. С тех пор много воды утекло и, когда я попытался поискать статью в Интернете, то обнаружил, что ни оригинальной статьи, ни перевода, найти практически невозможно. Перевод ещё сохранился в глубоких закромах OpenNet, а оригинал только в архиве Интернета. Ссылки на PDF-ки тоже протухли и больше не работают. Обидно, это ведь такая нетленка для системщиков. Понятно, что переносимость уже сто раз пережёвана в других статьях и книгах, но тут всё было сконцентрировано и написано доходчиво. При этом актуальность до сих пор не потеряна. Ну а что, собственно, кардинально поменялось в разработке переносимого кода на C с тех пор? Если не обращать внимание на упоминания некоторых архитектур и ОС, которые сейчас, да и во времена перевода, звучат, как придания старины глубокой, то в остальном, обо всех особенностях разработки переносимого кода, описанных в статье, надо помнить и сегодня. Выкладываю текст, как он есть, без каких-либо современных правок.

Для тех, кому удобнее читать в PDF, вот ссылки:

PDF оригинальной статьи

PDF перевода

А теперь сама статья.

Читать далее

Патчим OpenOCD для поддержки чипа NOR Flash

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

Disclaimer: "чукча не писатель, чукча читатель"

UseCase 0: надоело переподключать плату с RP2040 и захотелось загружать прошивку из IDE по кнопке "Run"
UseCase 1: хочется пошаговой отладки, а не принтами.

Установил на одну из плат DebugProbe и попробовал подключиться.

Оказалось не все так просто - OpenOCD плевался на неизвестное устройство:

окунуться

Лампа для подсветки рассады или просто таймер. Конструкция выходного дня

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

Контроллер Лампы для Рассады

Умный контроллер освещения на базе ESP32 с управлением через Telegram бот. Проект выходного дня для любителей растениеводства.

Читать далее

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

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

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

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Поехали!

Syscall и cgo в Go

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

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

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

Читать далее

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

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

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

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

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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