Сирек - Sparse

Сирек
Түпнұсқа автор (лар)Линус Торвалдс
ӘзірлеушілерДжош Триплетт, Кристофер Ли, Люк Ван Оостенрик
Бастапқы шығарылым2003
Тұрақты шығарылым
0.6.3 / 18 қазан 2020 ж; 49 күн бұрын (2020-10-18)[1]
Репозиторий Мұны Wikidata-да өзгертіңіз
ЖазылғанC
Операциялық жүйеLinux, BSD, OS X, МинГВ, Cygwin
ТүріСтатикалық кодты талдау
ЛицензияMIT лицензиясы
Веб-сайтсирек.докс. ядро.org

Сирек кодтаудың ықтимал ақауларын табуға арналған компьютерлік бағдарламалық құрал Linux ядросы.[2] Айырмашылығы жоқ басқа осындай құралдар, бұл статикалық талдау құрал басында қызығушылық туғызатын конструкцияларға ғана арналған ядро пайдаланушылар мен ядроларға сілтегіштерді араластыру сияқты әзірлеушілер мекенжай кеңістігі.

Сирек белгілі мәселелерді тексереді және әзірлеушіге кодқа аннотациялар енгізуге мүмкіндік береді, олар туралы ақпарат береді деректер түрлері, мысалы, сілтемелер көрсететін мекенжай кеңістігі және функция алатын немесе шығаратын құлыптар.

Линус Торвалдс Джар Триплетт 2006 жылдан бастап оны ұстаушы болды, бұл рөлді 2009 жылы Кристофер Ли қабылдады.[3]және Люк Ван Оостенрик 2018 жылдың қарашасында[4].Sparse астында шығарылады MIT лицензиясы.

Аннотация

Sparse жүргізген кейбір тексерулер үшін бастапқы кодқа түсініктеме беру қажет __атрибут__ GCC кеңейту немесе сирек-арнайы __мәтін__ спецификатор.[5] Сирек атрибуттардың келесі тізімін анықтайды:

  • мекенжай_ кеңістігі (сан)
  • биттік
  • күш
  • контекст (өрнек,мәтінмән,мәтінмән)

API макроспен анықталған кезде спецификатор __ атрибут __ ((контекст (...))) ауыстырылуы мүмкін __мәтін __ (...).

Linux ядросының анықтамалары

Linux ядросы келесі қысқа формаларды файлдардағы процессор алдындағы макростар ретінде анықтайды linux / compiler.h және linux / types.h (құрылыссыз __ЧЕКЕР__ жалауша, барлық аннотациялар кодтан алынып тасталды):

#ifdef __ CHECKER__# __user __attribute __ анықтаңыз ((noderef, address_space (1)))# __ ядро ​​__трибутты __ анықтаңыз ((мекен-жай_ кеңістігі (0)))# __safe __tribute __ ((қауіпсіз))# __force __attribute __ анықтаңыз ((күш))# анықтау __нокаст __атрибут __ ((nocast))# __iomem __attribute __ анықтаңыз ((noderef, address_space (2)))# __must_hold (x) __attribute __ ((контекст (x, 1,1))) анықтаңыз# __acquires (x) __attribute __ ((контекст (x, 0,1))) анықтаңыз# __ шығарылымдарды анықтаңыз (x) __ атрибут __ ((контекст (x, 1,0)))# __acquire (x) __context __ (x, 1) анықтаңыз# __ (x) __мәнмәнін __ (x, -1) анықтаңыз# __cond_lock (x, c) ((c)? ({__acquire (x); 1;}): 0) анықтаңыз# __percpu __attribute __ анықтаңыз ((noderef, address_space (3)))#ifdef CONFIG_SPARSE_RCU_POINTER# __rcu __трибутты __ анықтаңыз ((noderef, address_space (4)))# басқаша# __rcu анықтаңыз#endifэкстерн жарамсыз __chk_user_ptr(const тұрақсыз жарамсыз __user *);экстерн жарамсыз __chk_io_ptr(const тұрақсыз жарамсыз __iomem *);# басқаша# пайдаланушыны анықтаңыз# ядроны анықтаңыз# қауіпсіздікті анықтаңыз# __force анықтаңыз#nocast анықтаңыз# __iomem анықтаңыз# __chk_user_ptr (x) (void) 0 анықтаңыз# __chk_io_ptr (x) (void) 0 анықтаңыз# ескертуді анықтаңыз (ескерту (х, у ...) (1)# анықтау __must_hold (x)# __ququires (x) анықтаңыз# релизді анықтаңыз (x)# __acquire (x) (void) 0 анықтаңыз# анықтау __ (босату) (бос) 0# анықтау_cond_lock (x, c) (c)# __percpu анықтаңыз# __rcu анықтаңыз#endif
#ifdef __ CHECKER__# __битрис __трибутты __ ((разрядты)) анықтаңыз# басқаша# аралықпен анықтаңыз#endif

Мысалдар

Түрлері __le32 және __be32 әр түрлі 32-разрядты бүтін типтерді ұсынады өміршеңдік. Алайда Си тілі бұл типтердің айнымалыларын араластыруға болмайтындығын көрсетуге мүмкіндік бермейді. The биттік атрибут осы типтерді шектеулі деп белгілеу үшін қолданылады, сондықтан Sparse осы типтегі айнымалылар немесе басқа бүтін айнымалылар араласса ескерту береді:

typedef __u32 __ екі бағытта     __le32;typedef __u32 __ екі бағытта     __be32;

Шектелген түрлер арасындағы дұрыс түрлендірулерді белгілеу үшін кастинг күш атрибут сирек ескерту жасамау үшін қолданылады.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Люк Ван Оостенрик (2020-10-18). «Сирек 0.6.3». [email protected] (Тарату тізімі). Алынған 2020-12-05.
  2. ^ Yoann Padioleau; Рене Ридхоф Хансен; Джулия Л. Лоуэлл; Джилл Мюллер (2006). Linux құрылғы драйверлеріндегі кепіл эволюциясын құжаттауға және автоматтандыруға арналған семантикалық патчтар. Бағдарламалау тілдері және операциялық жүйелер бойынша 3-ші семинардың материалдары: заманауи операциялық жүйелерді лингвистикалық қолдау. CiteSeerX  10.1.1.122.7080. дои:10.1145/1215995.1216005. ISBN  1-59593-577-0. Жақында Linux қауымдастығы C кодын жақсы талдау үшін әр түрлі құралдарды қолдана бастады. Сирек - бұл компилятордың алдыңғы жағы сияқты абстрактілі синтаксис ағашына және С бағдарламасының мәтінін теруге ыңғайлы қол жетімділікті қамтамасыз ететін кітапхана.
  3. ^ Кристофер Ли (2009-10-16). «Сирек 0.4.2 шығарылды». линукс-сирек (Тарату тізімі). Алынған 2010-11-06.
  4. ^ Sparse-дің асыраушысын ауыстыру, алынды 10 желтоқсан, 2018
  5. ^ «Атрибуттық синтаксис - GNU Compiler Collection (GCC) пайдалану» «. Тегін бағдарламалық қамтамасыз ету қоры. Алынған 2010-11-13.

Әрі қарай оқу

Сыртқы сілтемелер