On Tue, 19 Sep 2017, Liam Breck wrote: > On Tue, Sep 19, 2017 at 3:00 PM, Julia Lawall wrote: > > > > > > On Tue, 19 Sep 2017, Liam Breck wrote: > > > >> Hi Julia, > >> > >> I think Sebastian referred this to you in hopes of receiving a script > >> that would find duplicate arrays, similarly to the way > >> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret > >> his request differently? > >> > >> bq27xxx_battery_dbg_dupes: > >> https://patchwork.kernel.org/patch/9918953/ > >> > >> The data structures being checked start here: > >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138 > >> > >> And are aggregated here: > >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743 > >> > >> The defines can be sed'd to pointers with 0 value, and array > >> comparisons where 1 pointer is 0 can be skipped. > > > > I followed the spirit of the runtime testing code. But Coccinelle doesn't > > normally unfold the definitions of macros. All it can do is take the > > different lists of fields and see if they are textually the same. > > There's no need to unfold macros. If you did, you would get false > positives. You do need to skip them somehow, hence the idea of sed'ing > to null pointers. I meant that for the properties, the values are: static enum power_supply_property bq27000_props[] = { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_PRESENT, POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_CURRENT_NOW, POWER_SUPPLY_PROP_CAPACITY, POWER_SUPPLY_PROP_CAPACITY_LEVEL, POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG, POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, POWER_SUPPLY_PROP_TECHNOLOGY, POWER_SUPPLY_PROP_CHARGE_FULL, POWER_SUPPLY_PROP_CHARGE_NOW, POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_ENERGY_NOW, POWER_SUPPLY_PROP_POWER_AVG, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_MANUFACTURER, }; Coccinelle is comparing the list of names, not the list of integers that these names are expanding to. Also, Coccinelle is comparing the list, but I guess you would prefer that it compare the set, to check for the cases where the names are the same but appear in a different order. > > > I've attached the script and some fake data that I made to test it. The > > fake data has some added cases where I have replaced 27 in the structure > > name by 07. For my test data I get: > > > > bq07421_regs and bq27421_regs have the same registers > > bq07000_regs and bq27000_regs have the same registers > > bq07421_dm_regs and bq27421_dm_regs have the same registers > > bq07421_props and bq27421_props have the same properties > > bq07000_props and bq27000_props have the same properties > > > > You won't get this currently; I needed to make some improvements to the > > Coccinelle C code parser. > > I didn't see anything attached, script or data. Sorry, should be there now. > The script should compare each object with only those objects that > follow it in sequence, so it doesn't repeat comparisons or compare to > self. It does this, ie it only compares xxx to yyy when xxx is alphabetically less than yyy. julia