За последние несколько лет мне пришлось столкнуться с множеством вопросов, которые были сформулированы примерно так: «мой проект не открывается в среде CLion». В свою очередь, это приводило к необходимости из раза в раз объяснять разным людям примерно одно и то же. Статья имеет целью сохранить тот опыт, который был накоплен в процессе анализа десятков разных проектов.
Во время обсуждения набора патчей, связанных с исправлением уязвимостей класса Spectre в коде для работы со связанными списками, стало ясно, что проблему удалось бы решить более изящно, если бы в ядро допускался код, использующий стандарт старше C89. Сейчас код в ядре должен соответствовать С89 (с GNU расширениями) на основе спецификации, сформированной ещё в 1989 году. Связанная со Spectre проблема была в том, что для перебора элементов списка используется макрос. Так как переменная цикла передаётся в этот макрос, то она определяется вне самого цикла и остаётся доступна после цикла. Использование более новых стандартов языка C позволит определять переменные для цикла прямо в блоке for.
В связи с этим, Линус Торвальдс предложил попробовать перейти в ядре 5.18 на стандарт C99, который был опубликован в 1999 году, на что получил встречное предложение перейти сразу на C11. При проверке сборки в GCC и Clang с новым стандартом проблем пока не возникло и, если при более тщательном тестировании ситуация не изменится, в сборочных скриптах ядра 5.18 опция --std=gnu89 будет заменена на --std=gnu11 -Wno-shift-negative-value.
В случае неудачи, переход будет отложен на один из следующих выпусков.
Помимо этого, была завершена проверка соответствия исходного кода стандарту MISRA C 2012: реализованы все правила MISRA C 2012, кроме 1.1, 1.2 (должны обеспечиваться компилятором) и 17.3 (может обеспечиваться компилятором), включая правила в поправках 1 и 2.
Исходный код анализатора распространяется по лицензии GPLv3.
Много воды утекло с момента выхода LDD3 (LDD4 мы, видимо, уже не дождёмся), безнадёжно устарел фундаментальный труд Бовета и Чезати, Роберт Лав давно не радовал нас своими прекрасными творениями. Казалось бы, в мире литературы о программировании ядра Linux наметилась устойчивая стагнация…
Но нет! Ситуацию спасает замечательный индийский программист со звучным именем Кайван Биллимория. Он написал книгу о программировании ядра, аж в двух томах.
Об авторе
Кайван программирует с 1983 года. В то время он самостоятельно научился программировать на бейсике, затем освоил Си и ассемблер под MS-DOS, а потом открыл для себя мир UNIX и Linux. Занимался программированием ядра и драйверов, участвовал в коммерческих и свободных проектах, занимался преподавательской деятельностью.
Повествование в книге ведётся на основе Ubuntu 18.04 LTS и ядра версии 5.4.
Rethrowing current exception with 'throw;', it seems there is no current exception to rethrow.
If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object
Сегодня (10.04.2021) состоялся первый релиз библиотеки YAFL.
YAFL - это библиотека, написанная на Си, содержащая несколько алгоритмов Калмановской фильтрации, распространяемая под лицензией Apache-2.0.
Библиотека ориентирована на применение во встраиваемых системах на базе микроконтроллеров с аппаратной поддержкой вычислений с плавающей точкой.
Для прототипирования алгоритмов обработки сигналов с использованием YAFL предполагается использовать Python 3.5+ и написанное на Cython расширение yaflpy.
Отличительные особенности библиотеки:
библиотека нацелена на преимущественное использование статического выделения памяти;
по мере возможности использованы алгоритмы, минимизирующие кеш-промахи;
в YAFL реализованы квадратнокорневые варианты алгоритмов фильтрации на основе UDU-разложения;
применены численно-стабильные методы вычислений, а так же регуляризация;
библиотека содержит алгоритмы, в которых применены меры для:
устранения расходимости фильтров
взвешивания результатов измерений с целью снижения влияния промахов/помех.
YAFL находится на ранней стадии разработки, код и документация могут содержать ошибки. Текущая версия библиотеки: 0.10.0.
Вышел перевод книги о легендарной эпохе, когда компьютеры были большими и тяжёлыми, частота измерялась в мегагерцах, а программы писали бородатые дядьки на зелёных терминалах, и происходило зарождение Си и UNIX.
ZenMake — ещё одна система сборки для C/C++ и ряда других языков программирования с декларативными конфигурационными файлами.
ZenMake написан на python с использованием Waf в качестве фреймворка. Основная цель проекта — быть простым в использовании насколько это возможно, но оставаться достаточно гибким.
Вышла новая версия luastatus, универсального генератора данных для панелей состояния, поддерживающего i3bar, dwm, lemonbar и др. Программа написана на C и распространяется под лицензией GNU LGPL v3.
Большинство генераторов данных для панелей состояния тайловых WM либо обновляют информацию по таймеру (например, conky), либо требуют сигнал для перерисовки (например, i3status). Панели же в составе окружений рабочего стола, как правило, обновляют информацию мгновенно и автоматически, как и luastatus.
luastatus позволяет пользователю определять логику обработки данных от плагинов, написанных на Си и поставляющихся с luastatus, с помощью виджетов, написанных на Lua. Также виджеты могут обрабатывать события, такие как щелчки по панели состояния.
Арифметика указателей в C и C++ разрешается только в пределах массивов, в соответствии со стандартами. Добавлены соответствующие проверки в Undefined Behavior Sanitizer.
Улучшена поддержка OpenCL и OpemMP 5.0.
Поведение в ряде случаев приближено к поведению GCC.
Вышла новая версия популярной системы сборки CMake 3.16.0 и сопутствующих утилит CTest и CPack, облегчающих тестирование и сборку пакетов соответственно.
Вышла новая версия системной библиотеки glibc – 2.30.
Некоторые обновления:
Кодировка символов, информация о типах символов и таблицы транслитерации обновлены и теперь поддерживают Unicode версии 12.1.0.
Динамический компоновщик принимает аргумент --preload для предварительной загрузки объектов в дополнение к переменной окружения LD_PRELOAD.
Добавлена функция twalk_r. Она похожа на уже имеющуюся функцию twalk, но она может передавать дополнительный аргумент в функцию обратного вызова.
В Linux были добавлены функции getdents64, gettid и tgkill.
Функции malloc, calloc, realloc, reallocarray, valloc, pvalloc, memalign и posix_memalign теперь не работают с объектами, размер которых больше, чем PTRDIFF_MAX. Это сделано для того, чтобы избежать переполнения типа ptrdiff_t.
Добавлены новые функции pthread_cond_clockwait, pthread_mutex_clocklock, pthread_rwlock_clockrdlock, pthread_rwlock_clockwrlock и sem_clockwait. Они эквивалентны timed, но также могут принимать параметр clockid_t, чтобы определить время ожидания. Все функции позволяют ожидать CLOCK_MONOTONIC и CLOCK_REALTIME. Решение о том, какие часы использовать, принимается во время ожидания (в отличие от pthread_condattr_setclock, который требует выбора часов во время инициализации).
В AArch64 распознаватель GNU IFUNC вызова ABI изменился: старые распознаватели все еще работают, а новые могут использовать второй аргумент, который может быть расширен в будущем. В настоящее время он содержит значение AT_HWCAP2.
Представлен новый выпуск консольного файлового менеджера cfiles, написанный на C и нацеленный на то, чтобы предоставить функционал файлового менеджера ranger, будучи при этом быстрым, легковесным и минималистичным.
Из особенностей можно выделить:
Vim-like управление.
Использует w3imgdisplay или Überzug для предпросмотра картинок на выбор пользователя.
Использует atool для предпросмотра архивов.
Использует mediainfo для просмотра информации о медиа-файлах и размеров файлов.
Вышла новая версия luastatus, универсального генератора данных для панелей состояния, поддерживающего i3bar, dwm, lemonbar и другие. Программа написана на C и распространяется под лицензией GNU LGPL v3.
Большинство генераторов данных для панелей состояния тайловых WM либо обновляют информацию по таймеру (например, conky), либо требуют сигнал для перерисовки (например, i3status). Панели же в составе окружений рабочего стола, как правило, обновляют информацию мгновенно и автоматически, как и luastatus.
luastatus позволяет пользователю определять логику обработки данных от плагинов, написанных на Си и поставляющихся с luastatus, с помощью виджетов, написанных на Lua. Также виджеты могут обрабатывать события, такие как щелчки по панели состояния.
Международная Организация по Стандартизации (ISO) опубликовала новый международный стандарт языка программирования C: ISO/IEC 9899:2018, его также называют C17 и C18.
Новый стандарт не вносит никаких новых возможностей, а лишь исправляет дефекты, сообщенные для C11. Значение макроса __STDC_VERSION__ увеличено до 201710L.
Поддержка C18 у GCC появилась, начиная с 8 версии, а у LLVM Clang — с 6.0. Чтобы указать во время компиляции использование стандарта C18 у GCC и LLVM Clang используются флаги -std=c17 и -std=gnu17. В GCC можно также указать новый стандарт флагами -std=c18 и -std=gnu18.
OrgaDoc предназначен для простого сопровождения и копирования набора документов между компьютерами. Набор документов можно синхронизировать с помощью rsync или unison. Не нужно устанавливать СУБД типа MySQL или PostgreSQL, HTTP-сервер, скриптовый язык типа PHP или Perl — достаточно установить OrgaDoc и генерировать им документы в HTML или других форматах.
Вышла новая версия luastatus, универсального генератора данных для панелей состояния, поддерживающего i3bar, dwm и lemonbar (также есть экспериментальная поддержка dzen/dzen2, xmobar, wmii и других). Программа написана на C и распространяется под лицензией GNU LGPL v3.
Большинство генераторов данных для панелей состояния тайловых WM либо обновляют информацию по таймеру (например, conky), либо требуют сигнал для перерисовки (например, i3status). Панели же в составе окружений рабочего стола, как правило, обновляют информацию мгновенно и автоматически, как и luastatus.
luastatus позволяет пользователю определять логику обработки данных от плагинов, написанных на Си и поставляющихся с luastatus, с помощью виджетов, написанных на Lua. Также виджеты могут обрабатывать события, такие как щелчки по панели состояния.
Нововведения релиза:
Поддержка так называемых “derived plugins” — плагинов, написанных на Lua.
Новые плагины:
dbus;
udev;
backlight-linux;
battery-linux;
cpu-usage-linux;
file-contents-linux;
imap;
mem-usage-linux;
pipe.
При ошибке в виджете теперь печатается стек-трейс.
nEMU — это ncurses-интерфейс к QEMU, упрощающий создание, настройку и управление виртуальными машинами. Код написан на языке C и распространяется под лицензией BSD-2.
В этом релизе был полностью переписан пользовательский интерфейс, т.к. старый был изначально странен и неудобен.