Messages in this thread | | | Date | Wed, 21 Sep 2016 07:04:28 +0200 (CEST) | From | Julia Lawall <> | Subject | Re: Possible code defects: macros and precedence |
| |
On Tue, 20 Sep 2016, Joe Perches wrote:
> On Tue, 2016-09-20 at 15:14 +0200, Julia Lawall wrote: > > The semantic patch below finds a binary operator in a macro and a binary > > operator in the use of the macro, and checks if the priority of the > > operator in the macro is higher (lower number) than the priority of the > > operator in the use. If this is the case, it adds parentheses in the use, > > which is not what one wants, but serves to show where the problem is. > > > > It doesn't turn up anything, except an occurrence of (u32)-1, which > > Coccinelle parses as a subtraction, due to not having any nearby evidence > > that u32 is a type. > > > > I didn't make any special effort on the include files, which means that > > only local include files and ones with the same name as the C file are > > taken into account. I can try with more aggressive include options. > > > > This only works with the github version of Coccinelle, as it required > > quite a lot of improvement to the treatmern of #define. > > > > julia > > > > @initialize:ocaml@ > > @@ > > > > let binoptbl = > > [("*",3);("/",3);("%",3); > > Shouldn't bitwise negation (~) and not (!) be added at 3? > > ("~",3);("!",3);
My semantic patch only covers binary operators at the moment, so I didn't put the complete table.
I can extend it.
julia
> > > ("+",4);("-",4); > > ("<<",5);(">>",5); > > ("<",6);(">",6);("<=",6);(">=",6); > > ("==",7);("!=",7); > > ("&",8); > > ("^",9); > > ("|",10); > > ("&&",11); > > ("||",12)] > > > > @r@ > > identifier i,j; > > identifier list[n] is; > > binary operator b; > > expression e; > > @@ > > > > #define i(is,j,...) (<+... \(j b e \| e b j\) ...+>) > > > > @s@ > > identifier r.i; > > expression list[r.n] es; > > binary operator b1; > > expression e1,e2; > > position p; > > @@ > > > > > i@p(es,e1 b1 e2,...) > > > > @script:ocaml@ > > _p << s.p; > > b << r.b; > > b1 << s.b1; > > @@ > > > > try > > let p1 = List.assoc b binoptbl in > > let p2 = List.assoc b1 binoptbl in > > if p1 >= p2 then Coccilib.include_match false > > with Not_found -> () > > > > @@ > > identifier r.i; > > expression list[r.n] es; > > expression e; > > position s.p; > > @@ > > > > i@p(es, > > +( > > e > > +) > > ,...) > > >
| |