On Mon, 28 Feb 2011, Jesper Louis Andersen wrote:
> The following function (From Erlang/OTP) has an interesting mistake:
>
> +++
>
> static char *hex(char digest[16], char buff[33])
> {
> static char tab[] = "0123456789abcdef";
> unsigned char *d = (unsigned char *) digest;
> //static char buff[sizeof(digest)*2 + 1];
> char *p = buff;
> int i;
>
> for (i = 0; i < sizeof(digest); ++i) {
> *p++ = tab[(int)((*d) >> 4)];
> *p++ = tab[(int)((*d++) & 0xF)];
> }
> *p = '\0';
> return buff;
> }
>
> +++
>
> In the for-loop, the call sizeof(digest) is returning 8 (on a 64bit
> arch) because the array 'digest' is passed as a parameter and hence is
> a pointer. The sizeof(...) operator then returns the pointer size and
> not the value of 16 which was intended. I want a semantic match on
> this beast :)
>
> So far, I've been able to come up with the following first iteration
> of a generalization which should match the above, but needs further
> generalization in order to hit similar and like problems:
>
> +++
>
> @ grab_sizeof @
> type T;
> function f;
> identifier x, buff;
> @@
>
> static char *f(T x[16], char buff[33])
> {
> ...
> * sizeof(x)
> ...
> }
>
> +++
>
> My problem however is that cocci does not like the array specifier in
>
> static char *f(T x[16], char buff[33])
>
> Specifically, it fails on the first occurrence of '[', an example from
> my tests:
>
> Fatal error: exception Failure("minus: parse error:
> = File "sizeof.2.cocci", line 5, column 28, charpos = 69
> around = '[', whole content = static char *hex(char digest[16],
> char buff[33])
I'll look into the array problem. But I'm not sure why you want to match
an array. sizeof does the right thing on arrays. You want to match the
pointer case. You could try just:
@@
expression *x;
@@
* sizeof(x)
> Will cocci currently support this notation? It looks as if the parser
> is not being a happy ladybug :) I have a hunch that just
> highlighting where this occurs can uncover many bugs with a quick
> glance as it is quite counter-intuitive to the programmer.
Like this? :)
http://www.securityfocus.com/bid/46307/info
(There is absolutley no useful information at this URL, but it is
precisely the problem you are talking about).
julia
> The full source code is available in the Erlang/OTP source code distribution
> at:
>
> https://github.com/erlang/otp/blob/dev/lib/erl_interface/src/connect/ei_connect.c
>
> and the commit that piqued my curiosity at:
>
> https://github.com/cristiangreco/otp/commit/6228f215f1a99ab282688516d3d577295fa8ef5a#diff-0
>
> --
> J.
> _______________________________________________
> Cocci mailing list
> [email protected]
> http://lists.diku.dk/mailman/listinfo/cocci
> (Web access from inside DIKUs LAN only)
>
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)