* [PATCH v2] coccinelle: provide rule for finding refcounters @ 2017-08-14 5:59 ` Elena Reshetova 0 siblings, 0 replies; 11+ messages in thread From: Elena Reshetova @ 2017-08-14 5:59 UTC (permalink / raw) To: julia.lawall Cc: linux-kernel, cocci, Gilles.Muller, nicolas.palix, mmarek, keescook, ishkamiel, Elena Reshetova changes in v2: Following the suggestion from Julia the first rule is split into 2. The output does not differ that much between these two versions, but rule became more precise. Elena Reshetova (1): Coccinelle: add atomic_as_refcounter script scripts/coccinelle/api/atomic_as_refcounter.cocci | 148 ++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 scripts/coccinelle/api/atomic_as_refcounter.cocci -- 2.7.4 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Cocci] [PATCH v2] coccinelle: provide rule for finding refcounters @ 2017-08-14 5:59 ` Elena Reshetova 0 siblings, 0 replies; 11+ messages in thread From: Elena Reshetova @ 2017-08-14 5:59 UTC (permalink / raw) To: cocci changes in v2: Following the suggestion from Julia the first rule is split into 2. The output does not differ that much between these two versions, but rule became more precise. Elena Reshetova (1): Coccinelle: add atomic_as_refcounter script scripts/coccinelle/api/atomic_as_refcounter.cocci | 148 ++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 scripts/coccinelle/api/atomic_as_refcounter.cocci -- 2.7.4 ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] Coccinelle: add atomic_as_refcounter script 2017-08-14 5:59 ` [Cocci] " Elena Reshetova @ 2017-08-14 5:59 ` Elena Reshetova -1 siblings, 0 replies; 11+ messages in thread From: Elena Reshetova @ 2017-08-14 5:59 UTC (permalink / raw) To: julia.lawall Cc: linux-kernel, cocci, Gilles.Muller, nicolas.palix, mmarek, keescook, ishkamiel, Elena Reshetova atomic_as_refcounter.cocci script allows detecting cases when refcount_t type and API should be used instead of atomic_t. Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> --- scripts/coccinelle/api/atomic_as_refcounter.cocci | 148 ++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 scripts/coccinelle/api/atomic_as_refcounter.cocci diff --git a/scripts/coccinelle/api/atomic_as_refcounter.cocci b/scripts/coccinelle/api/atomic_as_refcounter.cocci new file mode 100644 index 0000000..996d72b --- /dev/null +++ b/scripts/coccinelle/api/atomic_as_refcounter.cocci @@ -0,0 +1,148 @@ +// Check if refcount_t type and API should be used +// instead of atomic_t type when dealing with refcounters +// +// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation +// +// Confidence: Moderate +// URL: http://coccinelle.lip6.fr/ +// Options: --include-headers --very-quiet + +virtual report + +@r1 exists@ +identifier a, x, y; +position p1, p2; +identifier fname =~ ".*free.*"; +identifier fname2 =~ ".*destroy.*"; +identifier fname3 =~ ".*del.*"; +identifier fname4 =~ ".*queue_work.*"; +identifier fname5 =~ ".*schedule_work.*"; +identifier fname6 =~ ".*call_rcu.*"; + +@@ + +( + atomic_dec_and_test@p1(&(a)->x) +| + atomic_dec_and_lock@p1(&(a)->x, ...) +| + atomic_long_dec_and_lock@p1(&(a)->x, ...) +| + atomic_long_dec_and_test@p1(&(a)->x) +| + atomic64_dec_and_test@p1(&(a)->x) +| + local_dec_and_test@p1(&(a)->x) +) +... +( + fname@p2(a, ...); +| + fname2@p2(...); +| + fname3@p2(...); +| + fname4@p2(...); +| + fname5@p2(...); +| + fname6@p2(...); +) + + +@script:python depends on report@ +p1 << r1.p1; +p2 << r1.p2; +@@ +msg = "atomic_dec_and_test variation before object free at line %s." +coccilib.report.print_report(p1[0], msg % (p2[0].line)) + +@r4 exists@ +identifier a, x, y; +position p1, p2; +identifier fname =~ ".*free.*"; +identifier fname2 =~ ".*destroy.*"; +identifier fname3 =~ ".*del.*"; +identifier fname4 =~ ".*queue_work.*"; +identifier fname5 =~ ".*schedule_work.*"; +identifier fname6 =~ ".*call_rcu.*"; + +@@ + +( + atomic_dec_and_test@p1(&(a)->x) +| + atomic_dec_and_lock@p1(&(a)->x, ...) +| + atomic_long_dec_and_lock@p1(&(a)->x, ...) +| + atomic_long_dec_and_test@p1(&(a)->x) +| + atomic64_dec_and_test@p1(&(a)->x) +| + local_dec_and_test@p1(&(a)->x) +) +... +y=a +... +( + fname@p2(y, ...); +| + fname2@p2(...); +| + fname3@p2(...); +| + fname4@p2(...); +| + fname5@p2(...); +| + fname6@p2(...); +) + + +@script:python depends on report@ +p1 << r4.p1; +p2 << r4.p2; +@@ +msg = "atomic_dec_and_test variation before object free at line %s." +coccilib.report.print_report(p1[0], msg % (p2[0].line)) + +@r2 exists@ +identifier a, x; +position p1; +@@ + +( +atomic_add_unless(&(a)->x,-1,1)@p1 +| +atomic_long_add_unless(&(a)->x,-1,1)@p1 +| +atomic64_add_unless(&(a)->x,-1,1)@p1 +) + +@script:python depends on report@ +p1 << r2.p1; +@@ +msg = "atomic_add_unless" +coccilib.report.print_report(p1[0], msg) + +@r3 exists@ +identifier x; +position p1; +@@ + +( +x = atomic_add_return@p1(-1, ...); +| +x = atomic_long_add_return@p1(-1, ...); +| +x = atomic64_add_return@p1(-1, ...); +) + +@script:python depends on report@ +p1 << r3.p1; +@@ +msg = "x = atomic_add_return(-1, ...)" +coccilib.report.print_report(p1[0], msg) + + -- 2.7.4 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Cocci] [PATCH] Coccinelle: add atomic_as_refcounter script @ 2017-08-14 5:59 ` Elena Reshetova 0 siblings, 0 replies; 11+ messages in thread From: Elena Reshetova @ 2017-08-14 5:59 UTC (permalink / raw) To: cocci atomic_as_refcounter.cocci script allows detecting cases when refcount_t type and API should be used instead of atomic_t. Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> --- scripts/coccinelle/api/atomic_as_refcounter.cocci | 148 ++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 scripts/coccinelle/api/atomic_as_refcounter.cocci diff --git a/scripts/coccinelle/api/atomic_as_refcounter.cocci b/scripts/coccinelle/api/atomic_as_refcounter.cocci new file mode 100644 index 0000000..996d72b --- /dev/null +++ b/scripts/coccinelle/api/atomic_as_refcounter.cocci @@ -0,0 +1,148 @@ +// Check if refcount_t type and API should be used +// instead of atomic_t type when dealing with refcounters +// +// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation +// +// Confidence: Moderate +// URL: http://coccinelle.lip6.fr/ +// Options: --include-headers --very-quiet + +virtual report + + at r1 exists@ +identifier a, x, y; +position p1, p2; +identifier fname =~ ".*free.*"; +identifier fname2 =~ ".*destroy.*"; +identifier fname3 =~ ".*del.*"; +identifier fname4 =~ ".*queue_work.*"; +identifier fname5 =~ ".*schedule_work.*"; +identifier fname6 =~ ".*call_rcu.*"; + +@@ + +( + atomic_dec_and_test at p1(&(a)->x) +| + atomic_dec_and_lock at p1(&(a)->x, ...) +| + atomic_long_dec_and_lock at p1(&(a)->x, ...) +| + atomic_long_dec_and_test at p1(&(a)->x) +| + atomic64_dec_and_test at p1(&(a)->x) +| + local_dec_and_test at p1(&(a)->x) +) +... +( + fname at p2(a, ...); +| + fname2 at p2(...); +| + fname3 at p2(...); +| + fname4 at p2(...); +| + fname5 at p2(...); +| + fname6 at p2(...); +) + + + at script:python depends on report@ +p1 << r1.p1; +p2 << r1.p2; +@@ +msg = "atomic_dec_and_test variation before object free at line %s." +coccilib.report.print_report(p1[0], msg % (p2[0].line)) + + at r4 exists@ +identifier a, x, y; +position p1, p2; +identifier fname =~ ".*free.*"; +identifier fname2 =~ ".*destroy.*"; +identifier fname3 =~ ".*del.*"; +identifier fname4 =~ ".*queue_work.*"; +identifier fname5 =~ ".*schedule_work.*"; +identifier fname6 =~ ".*call_rcu.*"; + +@@ + +( + atomic_dec_and_test@p1(&(a)->x) +| + atomic_dec_and_lock at p1(&(a)->x, ...) +| + atomic_long_dec_and_lock at p1(&(a)->x, ...) +| + atomic_long_dec_and_test at p1(&(a)->x) +| + atomic64_dec_and_test at p1(&(a)->x) +| + local_dec_and_test at p1(&(a)->x) +) +... +y=a +... +( + fname at p2(y, ...); +| + fname2 at p2(...); +| + fname3 at p2(...); +| + fname4 at p2(...); +| + fname5 at p2(...); +| + fname6 at p2(...); +) + + + at script:python depends on report@ +p1 << r4.p1; +p2 << r4.p2; +@@ +msg = "atomic_dec_and_test variation before object free at line %s." +coccilib.report.print_report(p1[0], msg % (p2[0].line)) + +@r2 exists@ +identifier a, x; +position p1; +@@ + +( +atomic_add_unless(&(a)->x,-1,1)@p1 +| +atomic_long_add_unless(&(a)->x,-1,1)@p1 +| +atomic64_add_unless(&(a)->x,-1,1)@p1 +) + + at script:python depends on report@ +p1 << r2.p1; +@@ +msg = "atomic_add_unless" +coccilib.report.print_report(p1[0], msg) + + at r3 exists@ +identifier x; +position p1; +@@ + +( +x = atomic_add_return at p1(-1, ...); +| +x = atomic_long_add_return at p1(-1, ...); +| +x = atomic64_add_return at p1(-1, ...); +) + +@script:python depends on report@ +p1 << r3.p1; +@@ +msg = "x = atomic_add_return(-1, ...)" +coccilib.report.print_report(p1[0], msg) + + -- 2.7.4 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] Coccinelle: add atomic_as_refcounter script 2017-08-14 5:59 ` [Cocci] " Elena Reshetova @ 2017-08-14 14:16 ` Julia Lawall -1 siblings, 0 replies; 11+ messages in thread From: Julia Lawall @ 2017-08-14 14:16 UTC (permalink / raw) To: Elena Reshetova Cc: linux-kernel, cocci, Gilles Muller, nicolas.palix, mmarek, keescook, ishkamiel On Mon, 14 Aug 2017, Elena Reshetova wrote: > atomic_as_refcounter.cocci script allows detecting > cases when refcount_t type and API should be used > instead of atomic_t. > > Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> > --- > scripts/coccinelle/api/atomic_as_refcounter.cocci | 148 ++++++++++++++++++++++ > 1 file changed, 148 insertions(+) > create mode 100644 scripts/coccinelle/api/atomic_as_refcounter.cocci > > diff --git a/scripts/coccinelle/api/atomic_as_refcounter.cocci b/scripts/coccinelle/api/atomic_as_refcounter.cocci > new file mode 100644 > index 0000000..996d72b > --- /dev/null > +++ b/scripts/coccinelle/api/atomic_as_refcounter.cocci > @@ -0,0 +1,148 @@ > +// Check if refcount_t type and API should be used > +// instead of atomic_t type when dealing with refcounters > +// > +// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation > +// > +// Confidence: Moderate > +// URL: http://coccinelle.lip6.fr/ > +// Options: --include-headers --very-quiet > + > +virtual report > + > +@r1 exists@ > +identifier a, x, y; > +position p1, p2; > +identifier fname =~ ".*free.*"; > +identifier fname2 =~ ".*destroy.*"; > +identifier fname3 =~ ".*del.*"; > +identifier fname4 =~ ".*queue_work.*"; > +identifier fname5 =~ ".*schedule_work.*"; > +identifier fname6 =~ ".*call_rcu.*"; > + > +@@ > + > +( > + atomic_dec_and_test@p1(&(a)->x) > +| > + atomic_dec_and_lock@p1(&(a)->x, ...) > +| > + atomic_long_dec_and_lock@p1(&(a)->x, ...) > +| > + atomic_long_dec_and_test@p1(&(a)->x) > +| > + atomic64_dec_and_test@p1(&(a)->x) > +| > + local_dec_and_test@p1(&(a)->x) > +) > +... > +( > + fname@p2(a, ...); > +| > + fname2@p2(...); > +| > + fname3@p2(...); > +| > + fname4@p2(...); > +| > + fname5@p2(...); > +| > + fname6@p2(...); > +) > + > + > +@script:python depends on report@ > +p1 << r1.p1; > +p2 << r1.p2; > +@@ > +msg = "atomic_dec_and_test variation before object free at line %s." > +coccilib.report.print_report(p1[0], msg % (p2[0].line)) > + > +@r4 exists@ > +identifier a, x, y; > +position p1, p2; > +identifier fname =~ ".*free.*"; > +identifier fname2 =~ ".*destroy.*"; > +identifier fname3 =~ ".*del.*"; > +identifier fname4 =~ ".*queue_work.*"; > +identifier fname5 =~ ".*schedule_work.*"; > +identifier fname6 =~ ".*call_rcu.*"; > + > +@@ > + > +( > + atomic_dec_and_test@p1(&(a)->x) > +| > + atomic_dec_and_lock@p1(&(a)->x, ...) > +| > + atomic_long_dec_and_lock@p1(&(a)->x, ...) > +| > + atomic_long_dec_and_test@p1(&(a)->x) > +| > + atomic64_dec_and_test@p1(&(a)->x) > +| > + local_dec_and_test@p1(&(a)->x) > +) > +... > +y=a > +... > +( > + fname@p2(y, ...); > +| > + fname2@p2(...); >From here to the end of the rule there is no a or y. So they would match the same thing as in the previous rule. so you could get rid of all of these cases, and just leave fname@p2(y, ...); julia > +| > + fname3@p2(...); > +| > + fname4@p2(...); > +| > + fname5@p2(...); > +| > + fname6@p2(...); > +) > + > + > +@script:python depends on report@ > +p1 << r4.p1; > +p2 << r4.p2; > +@@ > +msg = "atomic_dec_and_test variation before object free at line %s." > +coccilib.report.print_report(p1[0], msg % (p2[0].line)) > + > +@r2 exists@ > +identifier a, x; > +position p1; > +@@ > + > +( > +atomic_add_unless(&(a)->x,-1,1)@p1 > +| > +atomic_long_add_unless(&(a)->x,-1,1)@p1 > +| > +atomic64_add_unless(&(a)->x,-1,1)@p1 > +) > + > +@script:python depends on report@ > +p1 << r2.p1; > +@@ > +msg = "atomic_add_unless" > +coccilib.report.print_report(p1[0], msg) > + > +@r3 exists@ > +identifier x; > +position p1; > +@@ > + > +( > +x = atomic_add_return@p1(-1, ...); > +| > +x = atomic_long_add_return@p1(-1, ...); > +| > +x = atomic64_add_return@p1(-1, ...); > +) > + > +@script:python depends on report@ > +p1 << r3.p1; > +@@ > +msg = "x = atomic_add_return(-1, ...)" > +coccilib.report.print_report(p1[0], msg) > + > + > -- > 2.7.4 > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Cocci] [PATCH] Coccinelle: add atomic_as_refcounter script @ 2017-08-14 14:16 ` Julia Lawall 0 siblings, 0 replies; 11+ messages in thread From: Julia Lawall @ 2017-08-14 14:16 UTC (permalink / raw) To: cocci On Mon, 14 Aug 2017, Elena Reshetova wrote: > atomic_as_refcounter.cocci script allows detecting > cases when refcount_t type and API should be used > instead of atomic_t. > > Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> > --- > scripts/coccinelle/api/atomic_as_refcounter.cocci | 148 ++++++++++++++++++++++ > 1 file changed, 148 insertions(+) > create mode 100644 scripts/coccinelle/api/atomic_as_refcounter.cocci > > diff --git a/scripts/coccinelle/api/atomic_as_refcounter.cocci b/scripts/coccinelle/api/atomic_as_refcounter.cocci > new file mode 100644 > index 0000000..996d72b > --- /dev/null > +++ b/scripts/coccinelle/api/atomic_as_refcounter.cocci > @@ -0,0 +1,148 @@ > +// Check if refcount_t type and API should be used > +// instead of atomic_t type when dealing with refcounters > +// > +// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation > +// > +// Confidence: Moderate > +// URL: http://coccinelle.lip6.fr/ > +// Options: --include-headers --very-quiet > + > +virtual report > + > + at r1 exists@ > +identifier a, x, y; > +position p1, p2; > +identifier fname =~ ".*free.*"; > +identifier fname2 =~ ".*destroy.*"; > +identifier fname3 =~ ".*del.*"; > +identifier fname4 =~ ".*queue_work.*"; > +identifier fname5 =~ ".*schedule_work.*"; > +identifier fname6 =~ ".*call_rcu.*"; > + > +@@ > + > +( > + atomic_dec_and_test at p1(&(a)->x) > +| > + atomic_dec_and_lock at p1(&(a)->x, ...) > +| > + atomic_long_dec_and_lock at p1(&(a)->x, ...) > +| > + atomic_long_dec_and_test at p1(&(a)->x) > +| > + atomic64_dec_and_test at p1(&(a)->x) > +| > + local_dec_and_test at p1(&(a)->x) > +) > +... > +( > + fname at p2(a, ...); > +| > + fname2 at p2(...); > +| > + fname3 at p2(...); > +| > + fname4 at p2(...); > +| > + fname5 at p2(...); > +| > + fname6 at p2(...); > +) > + > + > + at script:python depends on report@ > +p1 << r1.p1; > +p2 << r1.p2; > +@@ > +msg = "atomic_dec_and_test variation before object free at line %s." > +coccilib.report.print_report(p1[0], msg % (p2[0].line)) > + > + at r4 exists@ > +identifier a, x, y; > +position p1, p2; > +identifier fname =~ ".*free.*"; > +identifier fname2 =~ ".*destroy.*"; > +identifier fname3 =~ ".*del.*"; > +identifier fname4 =~ ".*queue_work.*"; > +identifier fname5 =~ ".*schedule_work.*"; > +identifier fname6 =~ ".*call_rcu.*"; > + > +@@ > + > +( > + atomic_dec_and_test at p1(&(a)->x) > +| > + atomic_dec_and_lock at p1(&(a)->x, ...) > +| > + atomic_long_dec_and_lock at p1(&(a)->x, ...) > +| > + atomic_long_dec_and_test at p1(&(a)->x) > +| > + atomic64_dec_and_test at p1(&(a)->x) > +| > + local_dec_and_test at p1(&(a)->x) > +) > +... > +y=a > +... > +( > + fname at p2(y, ...); > +| > + fname2 at p2(...); >From here to the end of the rule there is no a or y. So they would match the same thing as in the previous rule. so you could get rid of all of these cases, and just leave fname at p2(y, ...); julia > +| > + fname3 at p2(...); > +| > + fname4 at p2(...); > +| > + fname5 at p2(...); > +| > + fname6 at p2(...); > +) > + > + > + at script:python depends on report@ > +p1 << r4.p1; > +p2 << r4.p2; > +@@ > +msg = "atomic_dec_and_test variation before object free at line %s." > +coccilib.report.print_report(p1[0], msg % (p2[0].line)) > + > + at r2 exists@ > +identifier a, x; > +position p1; > +@@ > + > +( > +atomic_add_unless(&(a)->x,-1,1)@p1 > +| > +atomic_long_add_unless(&(a)->x,-1,1)@p1 > +| > +atomic64_add_unless(&(a)->x,-1,1)@p1 > +) > + > + at script:python depends on report@ > +p1 << r2.p1; > +@@ > +msg = "atomic_add_unless" > +coccilib.report.print_report(p1[0], msg) > + > + at r3 exists@ > +identifier x; > +position p1; > +@@ > + > +( > +x = atomic_add_return at p1(-1, ...); > +| > +x = atomic_long_add_return at p1(-1, ...); > +| > +x = atomic64_add_return at p1(-1, ...); > +) > + > + at script:python depends on report@ > +p1 << r3.p1; > +@@ > +msg = "x = atomic_add_return(-1, ...)" > +coccilib.report.print_report(p1[0], msg) > + > + > -- > 2.7.4 > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH] Coccinelle: add atomic_as_refcounter script 2017-08-14 14:16 ` [Cocci] " Julia Lawall @ 2017-08-15 12:19 ` Reshetova, Elena -1 siblings, 0 replies; 11+ messages in thread From: Reshetova, Elena @ 2017-08-15 12:19 UTC (permalink / raw) To: Julia Lawall Cc: linux-kernel, cocci, Gilles Muller, nicolas.palix, mmarek, keescook, ishkamiel > On Mon, 14 Aug 2017, Elena Reshetova wrote: > > > atomic_as_refcounter.cocci script allows detecting > > cases when refcount_t type and API should be used > > instead of atomic_t. > > > > Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> > > --- > > scripts/coccinelle/api/atomic_as_refcounter.cocci | 148 > ++++++++++++++++++++++ > > 1 file changed, 148 insertions(+) > > create mode 100644 scripts/coccinelle/api/atomic_as_refcounter.cocci > > > > diff --git a/scripts/coccinelle/api/atomic_as_refcounter.cocci > b/scripts/coccinelle/api/atomic_as_refcounter.cocci > > new file mode 100644 > > index 0000000..996d72b > > --- /dev/null > > +++ b/scripts/coccinelle/api/atomic_as_refcounter.cocci > > @@ -0,0 +1,148 @@ > > +// Check if refcount_t type and API should be used > > +// instead of atomic_t type when dealing with refcounters > > +// > > +// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation > > +// > > +// Confidence: Moderate > > +// URL: http://coccinelle.lip6.fr/ > > +// Options: --include-headers --very-quiet > > + > > +virtual report > > + > > +@r1 exists@ > > +identifier a, x, y; > > +position p1, p2; > > +identifier fname =~ ".*free.*"; > > +identifier fname2 =~ ".*destroy.*"; > > +identifier fname3 =~ ".*del.*"; > > +identifier fname4 =~ ".*queue_work.*"; > > +identifier fname5 =~ ".*schedule_work.*"; > > +identifier fname6 =~ ".*call_rcu.*"; > > + > > +@@ > > + > > +( > > + atomic_dec_and_test@p1(&(a)->x) > > +| > > + atomic_dec_and_lock@p1(&(a)->x, ...) > > +| > > + atomic_long_dec_and_lock@p1(&(a)->x, ...) > > +| > > + atomic_long_dec_and_test@p1(&(a)->x) > > +| > > + atomic64_dec_and_test@p1(&(a)->x) > > +| > > + local_dec_and_test@p1(&(a)->x) > > +) > > +... > > +( > > + fname@p2(a, ...); > > +| > > + fname2@p2(...); > > +| > > + fname3@p2(...); > > +| > > + fname4@p2(...); > > +| > > + fname5@p2(...); > > +| > > + fname6@p2(...); > > +) > > + > > + > > +@script:python depends on report@ > > +p1 << r1.p1; > > +p2 << r1.p2; > > +@@ > > +msg = "atomic_dec_and_test variation before object free at line %s." > > +coccilib.report.print_report(p1[0], msg % (p2[0].line)) > > + > > +@r4 exists@ > > +identifier a, x, y; > > +position p1, p2; > > +identifier fname =~ ".*free.*"; > > +identifier fname2 =~ ".*destroy.*"; > > +identifier fname3 =~ ".*del.*"; > > +identifier fname4 =~ ".*queue_work.*"; > > +identifier fname5 =~ ".*schedule_work.*"; > > +identifier fname6 =~ ".*call_rcu.*"; > > + > > +@@ > > + > > +( > > + atomic_dec_and_test@p1(&(a)->x) > > +| > > + atomic_dec_and_lock@p1(&(a)->x, ...) > > +| > > + atomic_long_dec_and_lock@p1(&(a)->x, ...) > > +| > > + atomic_long_dec_and_test@p1(&(a)->x) > > +| > > + atomic64_dec_and_test@p1(&(a)->x) > > +| > > + local_dec_and_test@p1(&(a)->x) > > +) > > +... > > +y=a > > +... > > +( > > + fname@p2(y, ...); > > +| > > + fname2@p2(...); > > From here to the end of the rule there is no a or y. So they would match > the same thing as in the previous rule. so you could get rid of all of > these cases, and just leave fname@p2(y, ...); True, stupid of me :( Will fix. Best Regards, Elena. > > julia > > > +| > > + fname3@p2(...); > > +| > > + fname4@p2(...); > > +| > > + fname5@p2(...); > > +| > > + fname6@p2(...); > > +) > > + > > + > > +@script:python depends on report@ > > +p1 << r4.p1; > > +p2 << r4.p2; > > +@@ > > +msg = "atomic_dec_and_test variation before object free at line %s." > > +coccilib.report.print_report(p1[0], msg % (p2[0].line)) > > + > > +@r2 exists@ > > +identifier a, x; > > +position p1; > > +@@ > > + > > +( > > +atomic_add_unless(&(a)->x,-1,1)@p1 > > +| > > +atomic_long_add_unless(&(a)->x,-1,1)@p1 > > +| > > +atomic64_add_unless(&(a)->x,-1,1)@p1 > > +) > > + > > +@script:python depends on report@ > > +p1 << r2.p1; > > +@@ > > +msg = "atomic_add_unless" > > +coccilib.report.print_report(p1[0], msg) > > + > > +@r3 exists@ > > +identifier x; > > +position p1; > > +@@ > > + > > +( > > +x = atomic_add_return@p1(-1, ...); > > +| > > +x = atomic_long_add_return@p1(-1, ...); > > +| > > +x = atomic64_add_return@p1(-1, ...); > > +) > > + > > +@script:python depends on report@ > > +p1 << r3.p1; > > +@@ > > +msg = "x = atomic_add_return(-1, ...)" > > +coccilib.report.print_report(p1[0], msg) > > + > > + > > -- > > 2.7.4 > > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Cocci] [PATCH] Coccinelle: add atomic_as_refcounter script @ 2017-08-15 12:19 ` Reshetova, Elena 0 siblings, 0 replies; 11+ messages in thread From: Reshetova, Elena @ 2017-08-15 12:19 UTC (permalink / raw) To: cocci > On Mon, 14 Aug 2017, Elena Reshetova wrote: > > > atomic_as_refcounter.cocci script allows detecting > > cases when refcount_t type and API should be used > > instead of atomic_t. > > > > Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> > > --- > > scripts/coccinelle/api/atomic_as_refcounter.cocci | 148 > ++++++++++++++++++++++ > > 1 file changed, 148 insertions(+) > > create mode 100644 scripts/coccinelle/api/atomic_as_refcounter.cocci > > > > diff --git a/scripts/coccinelle/api/atomic_as_refcounter.cocci > b/scripts/coccinelle/api/atomic_as_refcounter.cocci > > new file mode 100644 > > index 0000000..996d72b > > --- /dev/null > > +++ b/scripts/coccinelle/api/atomic_as_refcounter.cocci > > @@ -0,0 +1,148 @@ > > +// Check if refcount_t type and API should be used > > +// instead of atomic_t type when dealing with refcounters > > +// > > +// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation > > +// > > +// Confidence: Moderate > > +// URL: http://coccinelle.lip6.fr/ > > +// Options: --include-headers --very-quiet > > + > > +virtual report > > + > > + at r1 exists@ > > +identifier a, x, y; > > +position p1, p2; > > +identifier fname =~ ".*free.*"; > > +identifier fname2 =~ ".*destroy.*"; > > +identifier fname3 =~ ".*del.*"; > > +identifier fname4 =~ ".*queue_work.*"; > > +identifier fname5 =~ ".*schedule_work.*"; > > +identifier fname6 =~ ".*call_rcu.*"; > > + > > +@@ > > + > > +( > > + atomic_dec_and_test at p1(&(a)->x) > > +| > > + atomic_dec_and_lock at p1(&(a)->x, ...) > > +| > > + atomic_long_dec_and_lock at p1(&(a)->x, ...) > > +| > > + atomic_long_dec_and_test at p1(&(a)->x) > > +| > > + atomic64_dec_and_test at p1(&(a)->x) > > +| > > + local_dec_and_test at p1(&(a)->x) > > +) > > +... > > +( > > + fname at p2(a, ...); > > +| > > + fname2 at p2(...); > > +| > > + fname3 at p2(...); > > +| > > + fname4 at p2(...); > > +| > > + fname5 at p2(...); > > +| > > + fname6 at p2(...); > > +) > > + > > + > > + at script:python depends on report@ > > +p1 << r1.p1; > > +p2 << r1.p2; > > +@@ > > +msg = "atomic_dec_and_test variation before object free at line %s." > > +coccilib.report.print_report(p1[0], msg % (p2[0].line)) > > + > > + at r4 exists@ > > +identifier a, x, y; > > +position p1, p2; > > +identifier fname =~ ".*free.*"; > > +identifier fname2 =~ ".*destroy.*"; > > +identifier fname3 =~ ".*del.*"; > > +identifier fname4 =~ ".*queue_work.*"; > > +identifier fname5 =~ ".*schedule_work.*"; > > +identifier fname6 =~ ".*call_rcu.*"; > > + > > +@@ > > + > > +( > > + atomic_dec_and_test at p1(&(a)->x) > > +| > > + atomic_dec_and_lock at p1(&(a)->x, ...) > > +| > > + atomic_long_dec_and_lock at p1(&(a)->x, ...) > > +| > > + atomic_long_dec_and_test at p1(&(a)->x) > > +| > > + atomic64_dec_and_test at p1(&(a)->x) > > +| > > + local_dec_and_test at p1(&(a)->x) > > +) > > +... > > +y=a > > +... > > +( > > + fname at p2(y, ...); > > +| > > + fname2 at p2(...); > > From here to the end of the rule there is no a or y. So they would match > the same thing as in the previous rule. so you could get rid of all of > these cases, and just leave fname at p2(y, ...); True, stupid of me :( Will fix. Best Regards, Elena. > > julia > > > +| > > + fname3 at p2(...); > > +| > > + fname4 at p2(...); > > +| > > + fname5 at p2(...); > > +| > > + fname6 at p2(...); > > +) > > + > > + > > + at script:python depends on report@ > > +p1 << r4.p1; > > +p2 << r4.p2; > > +@@ > > +msg = "atomic_dec_and_test variation before object free at line %s." > > +coccilib.report.print_report(p1[0], msg % (p2[0].line)) > > + > > + at r2 exists@ > > +identifier a, x; > > +position p1; > > +@@ > > + > > +( > > +atomic_add_unless(&(a)->x,-1,1)@p1 > > +| > > +atomic_long_add_unless(&(a)->x,-1,1)@p1 > > +| > > +atomic64_add_unless(&(a)->x,-1,1)@p1 > > +) > > + > > + at script:python depends on report@ > > +p1 << r2.p1; > > +@@ > > +msg = "atomic_add_unless" > > +coccilib.report.print_report(p1[0], msg) > > + > > + at r3 exists@ > > +identifier x; > > +position p1; > > +@@ > > + > > +( > > +x = atomic_add_return at p1(-1, ...); > > +| > > +x = atomic_long_add_return at p1(-1, ...); > > +| > > +x = atomic64_add_return at p1(-1, ...); > > +) > > + > > + at script:python depends on report@ > > +p1 << r3.p1; > > +@@ > > +msg = "x = atomic_add_return(-1, ...)" > > +coccilib.report.print_report(p1[0], msg) > > + > > + > > -- > > 2.7.4 > > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Cocci] Coccinelle: add atomic_as_refcounter script 2017-08-14 5:59 ` [Cocci] " Elena Reshetova (?) (?) @ 2017-08-15 10:55 ` SF Markus Elfring 2017-08-15 11:02 ` Julia Lawall -1 siblings, 1 reply; 11+ messages in thread From: SF Markus Elfring @ 2017-08-15 10:55 UTC (permalink / raw) To: cocci Dear Elena, Would you like to take another look at my development suggestion for your approach? https://systeme.lip6.fr/pipermail/cocci/2017-August/004300.html How do you think about to refactor another rule like the following? @r3 exists@ expression E; identifier I=~"^atomic(?:64|_long)?_add_return$"; position P; @@ E = I at P(-1, ...); Can the specification of SmPL constraints be occasionally be more succinct with the use of regular expressions? Regards, Markus ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Cocci] Coccinelle: add atomic_as_refcounter script 2017-08-15 10:55 ` [Cocci] " SF Markus Elfring @ 2017-08-15 11:02 ` Julia Lawall 2017-08-15 16:43 ` SF Markus Elfring 0 siblings, 1 reply; 11+ messages in thread From: Julia Lawall @ 2017-08-15 11:02 UTC (permalink / raw) To: cocci On Tue, 15 Aug 2017, SF Markus Elfring wrote: > Dear Elena, > > Would you like to take another look at my development suggestion for your approach? > https://systeme.lip6.fr/pipermail/cocci/2017-August/004300.html > > How do you think about to refactor another rule like the following? > > @r3 exists@ > expression E; > identifier I=~"^atomic(?:64|_long)?_add_return$"; > position P; > @@ > E = I at P(-1, ...); > > > Can the specification of SmPL constraints be occasionally be more succinct > with the use of regular expressions? Elena, please don't follow Markus's suggestion. Coccinelle doesn't interpret regular expressions when selecting code to work on, and thus the resulting rule will be less efficient. Markus, if you see this somehow, at least yesterday all mail sent to you was bouncing. julia ^ permalink raw reply [flat|nested] 11+ messages in thread
* [Cocci] Coccinelle: add atomic_as_refcounter script 2017-08-15 11:02 ` Julia Lawall @ 2017-08-15 16:43 ` SF Markus Elfring 0 siblings, 0 replies; 11+ messages in thread From: SF Markus Elfring @ 2017-08-15 16:43 UTC (permalink / raw) To: cocci > Elena, please don't follow Markus's suggestion. I suggest to consider additional software development possibilities. We have got recurring different opinions around the application of advanced regular expressions. > Coccinelle doesn't interpret regular expressions when selecting code to work on, This software behaviour can be fine. > and thus the resulting rule will be less efficient. I do not come to the same conclusion for some use cases. > Markus, if you see this somehow, Yes. - But I can read your response only by the web interface for your mailing list archive at the moment. https://systeme.lip6.fr/pipermail/cocci/2017-August/004308.html > at least yesterday all mail sent to you was bouncing. Thanks for this information. - I was not informed about such message exchange problems so far. I hope that communication difficulties will be fixed somehow. Regards, Markus ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2017-08-15 16:43 UTC | newest] Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-08-14 5:59 [PATCH v2] coccinelle: provide rule for finding refcounters Elena Reshetova 2017-08-14 5:59 ` [Cocci] " Elena Reshetova 2017-08-14 5:59 ` [PATCH] Coccinelle: add atomic_as_refcounter script Elena Reshetova 2017-08-14 5:59 ` [Cocci] " Elena Reshetova 2017-08-14 14:16 ` Julia Lawall 2017-08-14 14:16 ` [Cocci] " Julia Lawall 2017-08-15 12:19 ` Reshetova, Elena 2017-08-15 12:19 ` [Cocci] " Reshetova, Elena 2017-08-15 10:55 ` [Cocci] " SF Markus Elfring 2017-08-15 11:02 ` Julia Lawall 2017-08-15 16:43 ` SF Markus Elfring
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.