1 // SPDX-License-Identifier: GPL-2.0-only << 2 /// Find nested lock+irqsave functions that us 1 /// Find nested lock+irqsave functions that use the same flags variables 3 /// 2 /// 4 // Confidence: High 3 // Confidence: High 5 // Copyright: (C) 2010-2012 Nicolas Palix. !! 4 // Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 6 // Copyright: (C) 2010-2012 Julia Lawall, INRI !! 5 // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 7 // Copyright: (C) 2010-2012 Gilles Muller, INR !! 6 // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 8 // URL: https://coccinelle.gitlabpages.inria.f !! 7 // URL: http://coccinelle.lip6.fr/ 9 // Comments: 8 // Comments: 10 // Options: --no-includes --include-headers !! 9 // Options: -no_includes -include_headers 11 10 12 virtual context 11 virtual context 13 virtual org 12 virtual org 14 virtual report 13 virtual report 15 14 16 @r exists@ 15 @r exists@ 17 expression lock1,lock2,flags; 16 expression lock1,lock2,flags; 18 position p1,p2; 17 position p1,p2; 19 @@ 18 @@ 20 19 21 ( 20 ( 22 spin_lock_irqsave@p1(lock1,flags) 21 spin_lock_irqsave@p1(lock1,flags) 23 | 22 | 24 read_lock_irqsave@p1(lock1,flags) 23 read_lock_irqsave@p1(lock1,flags) 25 | 24 | 26 write_lock_irqsave@p1(lock1,flags) 25 write_lock_irqsave@p1(lock1,flags) 27 ) 26 ) 28 ... when != flags 27 ... when != flags 29 ( 28 ( 30 spin_lock_irqsave(lock1,flags) 29 spin_lock_irqsave(lock1,flags) 31 | 30 | 32 read_lock_irqsave(lock1,flags) 31 read_lock_irqsave(lock1,flags) 33 | 32 | 34 write_lock_irqsave(lock1,flags) 33 write_lock_irqsave(lock1,flags) 35 | 34 | 36 spin_lock_irqsave@p2(lock2,flags) 35 spin_lock_irqsave@p2(lock2,flags) 37 | 36 | 38 read_lock_irqsave@p2(lock2,flags) 37 read_lock_irqsave@p2(lock2,flags) 39 | 38 | 40 write_lock_irqsave@p2(lock2,flags) 39 write_lock_irqsave@p2(lock2,flags) 41 ) 40 ) 42 41 43 @d exists@ 42 @d exists@ 44 expression f <= r.flags; 43 expression f <= r.flags; 45 expression lock1,lock2,flags; 44 expression lock1,lock2,flags; 46 position r.p1, r.p2; 45 position r.p1, r.p2; 47 @@ 46 @@ 48 47 49 ( 48 ( 50 *spin_lock_irqsave@p1(lock1,flags) 49 *spin_lock_irqsave@p1(lock1,flags) 51 | 50 | 52 *read_lock_irqsave@p1(lock1,flags) 51 *read_lock_irqsave@p1(lock1,flags) 53 | 52 | 54 *write_lock_irqsave@p1(lock1,flags) 53 *write_lock_irqsave@p1(lock1,flags) 55 ) 54 ) 56 ... when != f 55 ... when != f 57 ( 56 ( 58 *spin_lock_irqsave@p2(lock2,flags) 57 *spin_lock_irqsave@p2(lock2,flags) 59 | 58 | 60 *read_lock_irqsave@p2(lock2,flags) 59 *read_lock_irqsave@p2(lock2,flags) 61 | 60 | 62 *write_lock_irqsave@p2(lock2,flags) 61 *write_lock_irqsave@p2(lock2,flags) 63 ) 62 ) 64 63 65 // ------------------------------------------- 64 // ---------------------------------------------------------------------- 66 65 67 @script:python depends on d && org@ 66 @script:python depends on d && org@ 68 p1 << r.p1; 67 p1 << r.p1; 69 p2 << r.p2; 68 p2 << r.p2; 70 @@ 69 @@ 71 70 72 cocci.print_main("original lock",p1) 71 cocci.print_main("original lock",p1) 73 cocci.print_secs("nested lock+irqsave that reu 72 cocci.print_secs("nested lock+irqsave that reuses flags",p2) 74 73 75 @script:python depends on d && report@ 74 @script:python depends on d && report@ 76 p1 << r.p1; 75 p1 << r.p1; 77 p2 << r.p2; 76 p2 << r.p2; 78 @@ 77 @@ 79 78 80 msg="ERROR: nested lock+irqsave that reuses fl 79 msg="ERROR: nested lock+irqsave that reuses flags from line %s." % (p1[0].line) 81 coccilib.report.print_report(p2[0], msg) 80 coccilib.report.print_report(p2[0], msg)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.