flags.cocci 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /// Find nested lock+irqsave functions that use the same flags variables
  2. ///
  3. // Confidence: High
  4. // Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  5. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
  7. // URL: http://coccinelle.lip6.fr/
  8. // Comments:
  9. // Options: --no-includes --include-headers
  10. virtual context
  11. virtual org
  12. virtual report
  13. @r exists@
  14. expression lock1,lock2,flags;
  15. position p1,p2;
  16. @@
  17. (
  18. spin_lock_irqsave@p1(lock1,flags)
  19. |
  20. read_lock_irqsave@p1(lock1,flags)
  21. |
  22. write_lock_irqsave@p1(lock1,flags)
  23. )
  24. ... when != flags
  25. (
  26. spin_lock_irqsave(lock1,flags)
  27. |
  28. read_lock_irqsave(lock1,flags)
  29. |
  30. write_lock_irqsave(lock1,flags)
  31. |
  32. spin_lock_irqsave@p2(lock2,flags)
  33. |
  34. read_lock_irqsave@p2(lock2,flags)
  35. |
  36. write_lock_irqsave@p2(lock2,flags)
  37. )
  38. @d exists@
  39. expression f <= r.flags;
  40. expression lock1,lock2,flags;
  41. position r.p1, r.p2;
  42. @@
  43. (
  44. *spin_lock_irqsave@p1(lock1,flags)
  45. |
  46. *read_lock_irqsave@p1(lock1,flags)
  47. |
  48. *write_lock_irqsave@p1(lock1,flags)
  49. )
  50. ... when != f
  51. (
  52. *spin_lock_irqsave@p2(lock2,flags)
  53. |
  54. *read_lock_irqsave@p2(lock2,flags)
  55. |
  56. *write_lock_irqsave@p2(lock2,flags)
  57. )
  58. // ----------------------------------------------------------------------
  59. @script:python depends on d && org@
  60. p1 << r.p1;
  61. p2 << r.p2;
  62. @@
  63. cocci.print_main("original lock",p1)
  64. cocci.print_secs("nested lock+irqsave that reuses flags",p2)
  65. @script:python depends on d && report@
  66. p1 << r.p1;
  67. p2 << r.p2;
  68. @@
  69. msg="ERROR: nested lock+irqsave that reuses flags from line %s." % (p1[0].line)
  70. coccilib.report.print_report(p2[0], msg)