Jump to content

Редкий

Редкий
Оригинальный автор(ы) Линус Торвальдс
Разработчик(и) Джош Триплетт, Кристофер Ли, Люк Ван Остенрик
Первоначальный выпуск 2003
Стабильная версия
0.6.4 / 6 сентября 2021 г .; 2 года назад ( 06.09.2021 ) [1]
Репозиторий
Написано в С
Операционная система Linux , BSD , macOS , MinGW , Cygwin
Тип Статический анализ кода
Лицензия МОЯ лицензия
Веб-сайт редкий .документы .ядро .org

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 не выдавал предупреждение.

См. также

[ редактировать ]
  1. ^ Люк Ван Остенрик (06 сентября 2021 г.). «Разреженная 0.6.4» . [электронная почта защищена] (список рассылки) . Проверено 8 мая 2024 г.
  2. ^ Йоан Падиоле; Рене Ридхоф Хансен; Джулия Л. Ловалл ; Жиль Мюллер (2006). Семантические исправления для документирования и автоматизации сопутствующих изменений в драйверах устройств Linux . Материалы 3-го семинара «Языки программирования и операционные системы: лингвистическое обеспечение современных операционных систем». CiteSeerX   10.1.1.122.7080 . дои : 10.1145/1215995.1216005 . ISBN  1-59593-577-0 . Сообщество Linux недавно начало использовать различные инструменты для лучшего анализа кода C. Sparse — это библиотека, которая, как и интерфейс компилятора, обеспечивает удобный доступ к абстрактному синтаксическому дереву и информации о типизации программы на языке C.
  3. ^ Кристофер Ли (16 октября 2009 г.). «Выпущен Sparse 0.4.2» . linux-sparse (список рассылки) . Проверено 6 ноября 2010 г.
  4. ^ изменить сопровождающего Sparse , получено 10 декабря 2018 г.
  5. ^ «Синтаксис атрибутов — использование коллекции компиляторов GNU (GCC)» . Фонд свободного программного обеспечения . Проверено 13 ноября 2010 г.

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b302937a588bd9c61c8b94e475357137__1715185680
URL1:https://arc.ask3.ru/arc/aa/b3/37/b302937a588bd9c61c8b94e475357137.html
Заголовок, (Title) документа по адресу, URL1:
Sparse - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)