Thank you for your help. After applying both patches, my previous test
cases work. However, I have a new case where binary operators do not seem
to work as expected.

bash> cat binop3.c
struct dog { int age; };

void main() {
    int i = 0;
    struct dog spot = {2};
    struct dog* spot_p = &spot;
    if( spot_p->age && (i = spot_p->age) < 3 ) {
        i = 1;
    }
}
bash> cat binop3.cocci
@@
identifier i, i2;
expression E1, E2;
constant c;
binary operator b;
@@

+ if( E1->i ) {
+      i2 = E2;
+     if (i2 < c) {
- if( E1->i && (i2 = E2) < c ) {
  ...
- }
+     }
+ }
bash> spatch --sp-file binop3.cocci binop3.c
init_defs_builtins: /usr/local/lib/coccinelle/standard.h
warning: rule starting on line 1: metavariable b not used in the - or
context code
HANDLING: binop3.c
diff =
--- binop3.c
+++ /tmp/cocci-output-8451-cce009-binop3.c
@@ -4,7 +4,10 @@ void main() {
     int i = 0;
     struct dog spot = {2};
     struct dog* spot_p = &spot;
-    if( spot_p->age && (i = spot_p->age) < 3 ) {
-        i = 1;
+    if (spot_p->age) {
+        i = spot_p->age;
+        if (i < 3) {
+            i = 1;
+        }
     }
 }
bash> cat binop4.cocci
@@
identifier i, i2;
expression E1, E2;
constant c;
binary operator b;
@@

+ if( E1->i ) {
+      i2 = E2;
+     if (i2 b c) {
- if( E1->i && (i2 = E2) b c ) {
  ...
- }
+     }
+ }
bash> spatch --sp-file binop4.cocci binop3.c
init_defs_builtins: /usr/local/lib/coccinelle/standard.h
HANDLING: binop3.c
bash> diff binop3.cocci binop4.cocci
10,11c10,11
< +     if (i2 < c) {
< - if( E1->i && (i2 = E2) < c ) {
---
> +     if (i2 b c) {
> - if( E1->i && (i2 = E2) b c ) {


Thanks,

Kris
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to