⚡️ Почему обычный `min(a, b)` в C может вернуть неожиданный результат
В C есть неприятная ловушка: если сравнивать signed и unsigned значения, компилятор может привести оба числа к unsigned.
И тогда отрицательное число внезапно превращается в огромное положительное.
Пример:
#define min(a, b) ((a) < (b) ? (a) : (b))
int x = -1;
unsigned int y = 10;
printf("%u\n", min(x, y));
Интуитивно кажется, что минимум — -1.
Но при сравнении x < y значение -1 приводится к unsigned и становится очень большим числом. В итоге сравнение работает уже не так, как ожидает разработчик.
Именно поэтому в Linux kernel макрос min() устроен хитрее. Он не просто сравнивает два значения, а сначала делает type check:
Она заставляет компилятор проверить, что типы совместимы. Если один аргумент signed, а другой unsigned, такой код может превратиться в ошибку компиляции, а не в тихий баг в рантайме.
Это хороший пример системного C-подхода: лучше сломать сборку сразу, чем получить «правильный» код, который иногда считает неправильно.
В низкоуровневом коде такие мелочи решают очень много. Один неудачный implicit conversion — и проверка размера, индекса или лимита начинает работать против вас.
Отменить потерю данных?
Подключите резервную площадку для быстрого восстановления ИТ-инфраструктуры
Ваши сервисы будут работать без простоя и потерь даже при сбоях основной инфраструктуры, если подключить аварийное восстановление в облако Selectel. Решение поддерживает актуальную копию системы и по клику переключается на резервный контур при неисправности.
Самостоятельно настраивать инфраструктуру не нужно. Выделенная под вас команда инженеров Selectel проведет аудит, составит план работ, настроит репликацию данных и сценарий восстановления. А после — проводит тестовое восстановление системы, чтобы в нужный момент все работало без ошибок. Вы получаете не просто сервис, а готовую резервную площадку для вашей инфраструктуры.
В Selectel бесплатно проведет пилотный проект для восстановления до 10 виртуальных машин при оплате лицензии «Хайстекс Акура». Оставляйте заявку здесь: https://slc.tl/8599e
Kali Linux 2026.2 получил набор практичных изменений, которые заметят те, кто реально запускает систему в VM, на рабочей машине или в NetHunter.
Обновили рабочие окружения: GNOME 50 и KDE Plasma 6.6. В GNOME улучшили отзывчивость файлового менеджера, загрузку иконок, работу с памятью и доступность. В KDE добавили новые улучшения для Wayland, accessibility и OCR в Spectacle, чтобы текст можно было вытаскивать прямо со скриншотов.
APT тоже меняется. Вместо старого /etc/apt/sources.list свежие установки теперь используют новый формат:
/etc/apt/sources.list.d/kali.sources
Старые системы не ломают, но направление понятно: Kali переходит на более современный deb822-style формат, как и другие Debian-based дистрибутивы.
Для VM пользователей главное изменение - загрузка стала быстрее. В предсобранных VM-образах больше не ставят лишнюю графическую firmware, из-за этого initrd стал меньше, а boot time в тестах Kali сократился примерно в 3 раза.
В релизе также добавили 9 новых инструментов, обновили пакеты и оставили ядро Linux 6.19, чтобы не ломать совместимость с NVIDIA. Для тех, кто хочет свежее, kernel 7.0 доступен через experimental/rolling.
NetHunter тоже получил заметные обновления: быстрее стартует приложение, появились фиксы для custom commands и chroot manager, обновили kernel flasher и начали волну патчей для qcacld3 injection на поддерживаемых устройствах.
Алгоритму почти 70 лет, а он до сих пор живёт в ядре Linux.
В 1957 году Wilkes, Wheeler и Gill описали быстрый способ считать количество установленных битов в числе. Не циклом по одному биту, а через маски и арифметику сразу над группами битов.
Идея простая:
- сначала считаем биты парами
- потом группами по 4
- потом по байтам
- в конце умножение собирает сумму в старший байт
Если в процессоре нет инструкции POPCNT, Linux использует похожий подход в __sw_hweight64.
Красивый пример того, как старый битовый трюк пережил десятилетия и всё ещё работает в современном системном коде.
Разбираем SQL-инъекцию на пальцах в формате Лайт против L. Что это такое, как обычная строка ввода меняет логику запроса, к чему это приводит и какими способами реально закрыть дыру. Коротко, по делу и так, чтобы запомнилось.
Больше таких видео: https://www.youtube.com/shorts/c4gBi094jkU