Řídké - Sparse
Původní autoři | Linus Torvalds |
---|---|
Vývojáři | Josh Triplett, Christopher Li, Luc Van Oostenryck |
První vydání | 2003 |
Stabilní uvolnění | 0.6.3 / 18. října 2020[1] |
Úložiště | ![]() |
Napsáno | C |
Operační systém | Linux, BSD, OS X, MinGW, Cygwin |
Typ | Statická analýza kódu |
Licence | Licence MIT |
webová stránka | řídký |
Řídké je počítačový softwarový nástroj určený k hledání možných chyb kódování v systému Windows Linuxové jádro.[2] Na rozdíl od další takové nástroje, tento statická analýza nástroj byl původně navržen tak, aby označoval pouze konstrukce, které by mohly být zajímavé jádro vývojáři, jako je směšování ukazatelů na uživatele a jádro adresní prostory.
Řídký kontroluje známé problémy a umožňuje vývojáři zahrnout do kódu poznámky, které sdělují informace o typy dat, jako je adresní prostor, na který ukazatele ukazují, a zámky, které funkce získává nebo uvolňuje.
Linus Torvalds Sparse začal psát v roce 2003. Josh Triplett byl jeho správcem od roku 2006, roli převzal Christopher Li v roce 2009[3]a Luc Van Oostenryck v listopadu 2018[4]Analýza se uvolňuje pod Licence MIT.
Anotace
Některé z kontrol prováděných Sparse vyžadují anotaci zdrojového kódu pomocí __atribut__
GCC rozšíření nebo specifické pro Sparse __kontext__
specifikátor.[5] Sparse definuje následující seznam atributů:
address_space (počet)
bitový
platnost
kontext(výraz,v souvislosti s,out_context)
Když je API definováno pomocí makra, specifikátor __attribute __ ((kontext (...)))
lze nahradit __kontext__(...)
.
Definice jádra Linuxu
Linuxové jádro definuje následující krátké formuláře jako makra před zpracováním v souborech linux / compiler.h a linux / types.h (při stavbě bez __CHECKER__
příznak, všechny tyto anotace jsou z kódu odstraněny):
#ifdef __CHECKER__# define __user __attribute __ ((noderef, address_space (1)))# define __kernel __attribute __ ((address_space (0)))# define __safe __attribute __ ((bezpečný))# define __force __attribute __ ((force))# define __nocast __attribute __ ((nocast))# define __iomem __attribute __ ((noderef, address_space (2)))# define __must_hold (x) __attribute __ ((kontext (x, 1,1)))# define __acquires (x) __attribute __ ((kontext (x, 0,1)))# define __releases (x) __attribute __ ((kontext (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)))#jiný# define __rcu#endifexterní prázdnota __chk_user_ptr(konst nestálý prázdnota __uživatel *);externí prázdnota __chk_io_ptr(konst nestálý prázdnota __iomem *);#jiný# definovat __user# definovat __kernel# define __safe# definovat __force# definovat __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)# definovat __percpu# define __rcu#endif
#ifdef __CHECKER__# define __bitwise __attribute __ ((bitwise))#jiný# definujte __bitwise#endif
Příklady
Typy __le32
a __be32
představují 32bitové celočíselné typy s různými endianismus. Jazyk C však neumožňuje určit, že proměnné těchto typů by se neměly míchat. The bitový
atribut se používá k označení těchto typů jako omezených, takže Sparse vydá varování, pokud jsou proměnné těchto typů nebo jiné celočíselné proměnné smíchány:
typedef __u32 __bitový __le32;typedef __u32 __bitový __be32;
Chcete-li označit platné převody mezi omezenými typy, casting s platnost
atribut se používá, aby se zabránilo tomu, aby Sparse vydal varování.
Viz také
Reference
- ^ Luc Van Oostenryck (2020-10-18). „Sparse 0.6.3“. [email protected] (Poštovní seznam). Citováno 2020-12-05.
- ^ Yoann Padioleau; René Rydhof Hansen; Julia L. Lawall; Gilles Muller (2006). Sémantické opravy pro dokumentaci a automatizaci evoluce kolaterálu v ovladačích zařízení s Linuxem. Sborník z 3. workshopu o programovacích jazycích a operačních systémech: jazyková podpora moderních operačních systémů. CiteSeerX 10.1.1.122.7080. doi:10.1145/1215995.1216005. ISBN 1-59593-577-0.
Komunita Linux nedávno začala používat různé nástroje k lepší analýze kódu C. Sparse je knihovna, která, stejně jako front-end kompilátoru, poskytuje pohodlný přístup k abstraktnímu stromu syntaxe a psaní informací o programu C.
- ^ Christopher Li (16. 10. 2009). „Sparse 0.4.2 released“. linux-řídký (Poštovní seznam). Citováno 2010-11-06.
- ^ změnit správce Sparse, vyvoláno 10. prosince 2018
- ^ "Syntaxe atributů - použití GNU Compiler Collection (GCC)". Free Software Foundation. Citováno 2010-11-13.
Další čtení
- Neil Brown (06.06.2016). „Řídké: pohled pod kapotu“. LWN.net. Citováno 2020-06-24.
- Jonathan Corbet (01.06.2004). "Automatické hledání problémů s jádrem". LWN.net. Citováno 2010-11-06.
- Doc Searls (2003-11-24). „Linus a šílenci, část I“. Linux Journal. Citováno 2010-11-06.
- Subrata Modak; Balbir Singh; Yamato Masatake (2009). Testování LTP - ověření jak jádra Linuxu, tak testovacích případů (PDF). Ottawa Linux Symposium 2009. 209–220. Citováno 2010-11-07.
- Daniel De Graaf (2010). Detekce statických vad v sadách změn (PDF) (Magisterská práce). Ames, Iowa: Iowská státní univerzita. OCLC 665146513. Citováno 2010-11-07.
externí odkazy
- Úřední dokumentace
- Použití řídkých pro kontrolu typů, Dokumentace k jádru Linuxu
- Linux Uživatele Manuál - Uživatelské příkazy : Sémantický analyzátor pro C -
- Linux Uživatele Manuál - Uživatelské příkazy : Obálka kompilátoru, která po kompilaci spustí Sparse -