[6/8] widl: Null-check pointers with [size_is]

Rob Shearman robertshearman at gmail.com
Sat Jan 10 17:10:40 CST 2009


2009/1/10 Michael Karcher <wine at mkarcher.dialup.fu-berlin.de>:
> This matches midl behaviour. In
>
>  void test1([out,size_is(x)] char str[], [in] int x);
>  void test2([size_is(x), out] char* str, [in] int x);
>
> the parameter to test1 is not NULL-checked, but the one to test2 is.
> ---
>  tools/widl/client.c    |    2 +-
>  tools/widl/proxy.c     |   15 ++++++++++-----
>  tools/widl/widltypes.h |    1 +
>  3 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/tools/widl/client.c b/tools/widl/client.c
> index a23e298..0b10eb6 100644
> --- a/tools/widl/client.c
> +++ b/tools/widl/client.c
> @@ -59,7 +59,7 @@ static void check_pointers(const var_t *func)
>
>     LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry )
>     {
> -        if (is_var_ptr(var) && cant_be_null(var))
> +        if (is_var_declptr(var) && cant_be_null(var))
>         {
>             print_client("if (!%s)\n", var->name);
>             print_client("{\n");
> diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
> index bb16b72..ce07ddc 100644
> --- a/tools/widl/proxy.c
> +++ b/tools/widl/proxy.c
> @@ -150,6 +150,11 @@ int is_var_ptr(const var_t *v)
>   return is_ptr(v->type);
>  }
>
> +int is_var_declptr(const var_t *v)
> +{
> +  return is_declptr(v->type);
> +}
> +

Again, this function doesn't seem to improve readability of the code.
I would just move the checking of the type of v into cant_be_null.

>  int cant_be_null(const var_t *v)
>  {
>   /* Search backwards for the most recent pointer attribute.  */
> @@ -164,10 +169,10 @@ int cant_be_null(const var_t *v)
>   if (is_user_type(type))
>       return 0;
>
> -  if (!attrs && is_ptr(type))
> +  if (!attrs && is_declptr(type))
>   {
>     attrs = type->attrs;
> -    type = type_pointer_get_ref(type);
> +    type = get_deref_type(type);
>   }
>
>   while (attrs)
> @@ -180,7 +185,7 @@ int cant_be_null(const var_t *v)
>     if (t == RPC_FC_RP)
>       return 1;
>
> -    if (is_ptr(type))
> +    if (is_declptr(type))
>     {
>       if (type->type == RPC_FC_FP ||
>           type->type == RPC_FC_OP ||
> @@ -188,7 +193,7 @@ int cant_be_null(const var_t *v)
>         return 0;
>
>       attrs = type->attrs;
> -      type = type_pointer_get_ref(type);
> +      type = get_deref_type(type);
>     }
>     else
>       attrs = NULL;

It would be simpler if you just did:
if (is_ptr(type))
    fc = type->type;
else
{
   <loop looking for pointer type>
}

return fc == RPC_FC_RP;

Note: there appears to be a bug in the current code where it walks
pointers looking for the pointer attribute, instead of walking just
aliases, so that should probably be fixed too.

-- 
Rob Shearman



More information about the wine-devel mailing list