flags.cocci 1.6 KB

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