On Sun, Apr 8, 2012 at 11:30 PM, Julia Lawall <[email protected]> wrote:
>
>
> On Sun, 8 Apr 2012, Jim Cromie wrote:
>
>> hi all,
>>
>> I recently posted the following patch to LKML.
>> ISTM that coccinelle is a reasonable way to find cases
>> where the macro would be useful and beneficial,
>> but detecting those situations is quite different than the usual cases.
>>
>> What do you think ?
>
>
> I'm not sure what kinds of cases should be considered?  What does the first
> argument to the macro represent?  How do you know when you want ARRAY_SIZE
> and when you want sizeof?

hi Julia,

ARRAY_SIZE is always a safe answer.
I added the sizeof examples for a simple explanation,
but it only works when the element sizes are guaranteed
to match.  That isnt a safe assumption for structs,
which may get fields added later.

the name arg is arbitrary - it only distinguishes between
multiple uses of the macro in the same scope.
Its a suffix on the expanded var name: BUILD_BUG_DECL_##name.
Referencing the expanded name should be considered bad,
the intent is *only* to break the compile if one array is longer
than the other.

The arrays to be checked are typically file-scope
static constant tables, but it would be good to handle
compares of file-static vs function static arrays.
And conceivably 2 tables defined in separate files.

I gave one example case in my forwarded email,
I trimmed the rest of that email, example (for b43) is below.

I dont know if its a good example, generally the confidence
for any report would be medium to low, enough to prompt a look
by the maintainer.

>
>
>> It is perhaps simpler to think about one-file-at-a-time,
>> that would cover 95% of uses.
>
>
> Coccinelle normally works one file at a time.
>

Ah but it does do API transformations, where
function and its users are in separate files.
IIUC, thats its main purpose and strength.

I was just "thinking aloud", looking for ways
to simplify the problem.


> julia
>
>> thanks
>> ~jimc
>>


>> For example (perhaps a bad one, I only eyeballed the tables
>> themselves): in drivers/net/wireless/b43/tables_lpphy.c, these 2
>> tables are the same size.  Should that be enforced ??
>>
>>  static const u16 lpphy_rev0_ofdm_cck_gain_table[] = {...}
>>  static const u16 lpphy_rev1_ofdm_cck_gain_table[] = {...}
>>

for this particular case, sizeof would work, since both arrays
are the same type.  Since coccinelle is good with type matching,
I guess it comes for free, but ARRAY_SIZE would be correct,
and there is no run-time cost here; only fixed arrays are
checked by the compiler.  My demo code tried testing 2 arrays
passed into a function, and checked inside - although gcc
can apparently optimize across function calls when it knows
all the callers (1 in that case), it didnt like the macro used
inside the fn.  That would be a case to explicitly skip.
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to