On Fri, 5 Dec 2014, Rasmus Villemoes wrote:
> On Fri, Dec 05 2014, Joe Perches <[email protected]> wrote: > > > On Fri, 2014-12-05 at 08:18 +0100, Julia Lawall wrote: > >> On Thu, 4 Dec 2014, Joe Perches wrote: > >> > >> Yes, by using python/ocaml: > >> > >> @r@ > >> char [] c; > >> position p; > >> identifier f; > >> @@ > >> > >> f(...,c@p,...) > >> > >> @script:ocaml@ > >> c << r.c; > >> p << r.p; > >> @@ > >> > >> let ce = (List.hd p).current_element in > >> if List.length(Str.split_delim (Str.regexp ce) c) > 1 > >> then Printf.printf "%s:%d: %s\n" > >> (List.hd p).file (List.hd p).line c > > > > Good to know, thanks. > > > >> Here are some results: > >> > >> drivers/net/wireless/zd1211rw/zd_usb.c:1573: "%s usb_exit()\n" > > [] > >> The idea would be to replace these by %s and __func__? That would also be > >> possible. > > > > Yes and no. > > > > A lot of these are function tracing style messages and > > those should just be deleted. > > Hardcoding the function name in a literal string also makes typos (or > copy-pastos) possible. I extended Julia's code to allow a small edit > distance. Requires the Levenshtein python module (on debian, apt-get > install python-levenshtein). It's not terribly slow, but to be really > useful I (or someone) would need to reduce the number of false positives. Cool. Thanks! julia > One gets for example > > drivers/net/wireless/rtlwifi/rtl8821ae/dm.c:2082:rtl8821ae_dm_txpwr_track_set_pwr():2: > "===>rtl8812ae_dm_txpwr_track_set_pwr\n" > drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c:1229:bnx2x_ets_e3b0_config():2: > "bnx2x_ets_E3B0_config SP failed\n" > > The first of these is probably one of the tracing style messages; the > second probably falls in the 'should use %s, __func__' category (other > strings in that function actually use lowercase e3b0). > > > @initialize:python@ > @@ > import re > from Levenshtein import distance > mindist = 1 > maxdist = 2 > ignore_leading = True > > @r@ > char [] c; > position p; > identifier f; > @@ > > f(...,c@p,...) > > @script:python@ > c << r.c; > p << r.p; > @@ > > func = p[0].current_element > wpattern = "[a-zA-Z_][a-zA-Z0-9_]*" > if ignore_leading: > func = func.strip("_") > wpattern = "[a-zA-Z][a-zA-Z0-9_]*" > lf = len(func) > // ignore extremely short function names > if lf > 3: > words = [w for w in re.findall(wpattern, c) if abs(len(w) - lf) <= maxdist] > for w in words: > d = distance(w, func) > if mindist <= d and d <= maxdist: > print "%s:%d:%s():%d: %s" % (p[0].file, int(p[0].line), func, > d, c) > break > > > > Rasmus > _______________________________________________ Cocci mailing list [email protected] https://systeme.lip6.fr/mailman/listinfo/cocci
