Редкий
Оригинальный автор(ы) | Линус Торвальдс |
---|---|
Разработчик(и) | Джош Триплетт, Кристофер Ли, Люк Ван Остенрик |
Первоначальный выпуск | 2003 |
Стабильная версия | 0.6.4
/ 6 сентября 2021 г [1] |
Репозиторий | |
Написано в | С |
Операционная система | Linux , BSD , macOS , MinGW , Cygwin |
Тип | Статический анализ кода |
Лицензия | МОЯ лицензия |
Веб-сайт | редкий |
Sparse — это компьютерный программный инструмент, предназначенный для поиска возможных ошибок кодирования в ядре Linux . [2] В отличие от других подобных инструментов , этот инструмент статического анализа изначально был разработан для пометки только тех конструкций, которые могли представлять интерес для разработчиков ядра , таких как смешивание указателей на адресное пространство пользователя и ядра .
Разреженный проверяет наличие известных проблем и позволяет разработчику включать в код аннотации, передающие информацию о типах данных , таких как адресное пространство, на которое указывают указатели, и блокировки, которые функция получает или снимает.
Линус Торвальдс начал писать Sparse в 2003 году. Джош Триплетт был его сопровождающим с 2006 года, а в 2009 году эту роль взял на себя Кристофер Ли. [3] и Люк Ван Остенрик в ноябре 2018 года. [4] Sparse выпускается под лицензией MIT .
Аннотации
[ редактировать ]Некоторые проверки, выполняемые Sparse, требуют аннотирования исходного кода с помощью __attribute__
Расширение GCC или специфичное для Sparse __context__
спецификатор. [5] Sparse определяет следующий список атрибутов:
address_space(num)
bitwise
force
context(expression,in_context,out_context)
Когда API определяется с помощью макроса, спецификатор __attribute__((context(...)))
можно заменить на __context__(...)
.
Определения ядра Linux
[ редактировать ]Ядро Linux определяет следующие краткие формы в качестве макросов препроцессора в файлах linux/compiler.h и linux/types.h (при сборке без __CHECKER__
флаг, все эти аннотации удаляются из кода):
#ifdef __CHECKER__
# define __user __attribute__((noderef, address_space(1)))
# define __kernel __attribute__((address_space(0)))
# define __safe __attribute__((safe))
# define __force __attribute__((force))
# define __nocast __attribute__((nocast))
# define __iomem __attribute__((noderef, address_space(2)))
# define __must_hold(x) __attribute__((context(x,1,1)))
# define __acquires(x) __attribute__((context(x,0,1)))
# define __releases(x) __attribute__((context(x,1,0)))
# define __acquire(x) __context__(x,1)
# define __release(x) __context__(x,-1)
# define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0)
# define __percpu __attribute__((noderef, address_space(3)))
#ifdef CONFIG_SPARSE_RCU_POINTER
# define __rcu __attribute__((noderef, address_space(4)))
#else
# define __rcu
#endif
extern void __chk_user_ptr(const volatile void __user *);
extern void __chk_io_ptr(const volatile void __iomem *);
#else
# define __user
# define __kernel
# define __safe
# define __force
# define __nocast
# define __iomem
# define __chk_user_ptr(x) (void)0
# define __chk_io_ptr(x) (void)0
# define __builtin_warning(x, y...) (1)
# define __must_hold(x)
# define __acquires(x)
# define __releases(x)
# define __acquire(x) (void)0
# define __release(x) (void)0
# define __cond_lock(x,c) (c)
# define __percpu
# define __rcu
#endif
#ifdef __CHECKER__
# define __bitwise __attribute__((bitwise))
#else
# define __bitwise
#endif
Примеры
[ редактировать ]Типы __le32
и __be32
представляют 32-битные целочисленные типы с разным порядком байтов . Однако язык C не позволяет указать, что переменные этих типов не следует смешивать. bitwise
Атрибут используется для пометки этих типов как ограниченных, поэтому Sparse выдаст предупреждение, если переменные этих типов или другие целочисленные переменные смешаны:
typedef __u32 __bitwise __le32;
typedef __u32 __bitwise __be32;
Чтобы отметить допустимые преобразования между ограниченными типами, необходимо выполнить приведение с помощью force
Атрибут используется, чтобы Sparse не выдавал предупреждение.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Люк Ван Остенрик (06 сентября 2021 г.). «Разреженная 0.6.4» . [электронная почта защищена] (список рассылки) . Проверено 8 мая 2024 г.
- ^ Йоан Падиоле; Рене Ридхоф Хансен; Джулия Л. Ловалл ; Жиль Мюллер (2006). Семантические исправления для документирования и автоматизации сопутствующих изменений в драйверах устройств Linux . Материалы 3-го семинара «Языки программирования и операционные системы: лингвистическое обеспечение современных операционных систем». CiteSeerX 10.1.1.122.7080 . дои : 10.1145/1215995.1216005 . ISBN 1-59593-577-0 .
Сообщество Linux недавно начало использовать различные инструменты для лучшего анализа кода C. Sparse — это библиотека, которая, как и интерфейс компилятора, обеспечивает удобный доступ к абстрактному синтаксическому дереву и информации о типизации программы на языке C.
- ^ Кристофер Ли (16 октября 2009 г.). «Выпущен Sparse 0.4.2» . linux-sparse (список рассылки) . Проверено 6 ноября 2010 г.
- ^ изменить сопровождающего Sparse , получено 10 декабря 2018 г.
- ^ «Синтаксис атрибутов — использование коллекции компиляторов GNU (GCC)» . Фонд свободного программного обеспечения . Проверено 13 ноября 2010 г.
Дальнейшее чтение
[ редактировать ]- Нил Браун (08 июня 2016 г.). «Спарс: взгляд под капот» . LWN.net . Проверено 26 ноября 2021 г.
- Джонатан Корбет (1 июня 2004 г.). «Автоматический поиск проблем ядра» . LWN.net . Проверено 26 ноября 2021 г.
- Док Сирлс (24 ноября 2003 г.). «Лайнус и безумцы, часть I» . Linux-журнал . Проверено 26 ноября 2021 г.
- Субрата Модак; Бальбир Сингх; Ямато Масатаке (2009). Тестирование LTP — проверка ядра Linux и тестовых примеров (PDF) . Оттавский симпозиум по Linux 2009 . стр. 209–220 . Проверено 26 ноября 2021 г.
- Дэниел Де Грааф (2010). Обнаружение статических ошибок в наборах изменений (PDF) (магистерская диссертация). Эймс, Айова: Университет штата Айова. OCLC 665146513 . Проверено 7 ноября 2010 г.
Внешние ссылки
[ редактировать ]- Официальная документация
- Использование sparse для проверки типов , Документация ядра Linux
- Linux пользователя Руководство – Пользовательские команды : Семантический парсер для C –
- Linux пользователя Руководство – Пользовательские команды : Оболочка компилятора для запуска Sparse после компиляции –