[PATCH v2 vkd3d] vkd3d-shader/hlsl: Handle over/underflow when parsing integer literals.

Giovanni Mascellani gmascellani at codeweavers.com
Thu May 12 08:53:53 CDT 2022


Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>

Il 11/05/22 16:39, Matteo Bruni ha scritto:
> Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
> ---
> v2: Don't duplicate parse_integer().
> 
> Supersedes 235242.
> 
> This fixes arithmetic-int.shader_test on 32-bit Linux for
> me.
> 
>   libs/vkd3d-shader/hlsl.l                 |  6 ++---
>   libs/vkd3d-shader/preproc.y              | 34 +-----------------------
>   libs/vkd3d-shader/vkd3d_shader_main.c    | 32 ++++++++++++++++++++++
>   libs/vkd3d-shader/vkd3d_shader_private.h |  2 ++
>   4 files changed, 38 insertions(+), 36 deletions(-)
> 
> diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l
> index 267c8c30..ff7b712f 100644
> --- a/libs/vkd3d-shader/hlsl.l
> +++ b/libs/vkd3d-shader/hlsl.l
> @@ -197,15 +197,15 @@ row_major               {return KW_ROW_MAJOR;           }
>                               return C_FLOAT;
>                           }
>   0x[0-9a-fA-F]+          {
> -                            sscanf(yytext, "0x%x", &yylval->intval);
> +                            yylval->intval = vkd3d_parse_integer(yytext);
>                               return C_INTEGER;
>                           }
>   0[0-7]+                 {
> -                            sscanf(yytext, "0%o", &yylval->intval);
> +                            yylval->intval = vkd3d_parse_integer(yytext);
>                               return C_INTEGER;
>                           }
>   [0-9]+                  {
> -                            yylval->intval = (atoi(yytext));
> +                            yylval->intval = vkd3d_parse_integer(yytext);
>                               return C_INTEGER;
>                           }
>   
> diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y
> index 3f02ac03..009c35ff 100644
> --- a/libs/vkd3d-shader/preproc.y
> +++ b/libs/vkd3d-shader/preproc.y
> @@ -165,38 +165,6 @@ static bool preproc_push_if(struct preproc_ctx *ctx, bool condition)
>       return true;
>   }
>   
> -static int char_to_int(char c)
> -{
> -    if ('0' <= c && c <= '9')
> -        return c - '0';
> -    if ('A' <= c && c <= 'F')
> -        return c - 'A' + 10;
> -    if ('a' <= c && c <= 'f')
> -        return c - 'a' + 10;
> -    return -1;
> -}
> -
> -static uint32_t preproc_parse_integer(const char *s)
> -{
> -    uint32_t base = 10, ret = 0;
> -    int digit;
> -
> -    if (*s == '0')
> -    {
> -        base = 8;
> -        ++s;
> -        if (*s == 'x' || *s == 'X')
> -        {
> -            base = 16;
> -            ++s;
> -        }
> -    }
> -
> -    while ((digit = char_to_int(*s++)) >= 0)
> -        ret = ret * base + (uint32_t)digit;
> -    return ret;
> -}
> -
>   static int default_open_include(const char *filename, bool local,
>           const char *parent_data, void *context, struct vkd3d_shader_code *out)
>   {
> @@ -691,7 +659,7 @@ directive
>   primary_expr
>       : T_INTEGER
>           {
> -            $$ = preproc_parse_integer($1);
> +            $$ = vkd3d_parse_integer($1);
>               vkd3d_free($1);
>           }
>       | T_IDENTIFIER
> diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
> index 62baf17f..6fd32435 100644
> --- a/libs/vkd3d-shader/vkd3d_shader_main.c
> +++ b/libs/vkd3d-shader/vkd3d_shader_main.c
> @@ -24,6 +24,38 @@
>   
>   VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
>   
> +static inline int char_to_int(char c)
> +{
> +    if ('0' <= c && c <= '9')
> +        return c - '0';
> +    if ('A' <= c && c <= 'F')
> +        return c - 'A' + 10;
> +    if ('a' <= c && c <= 'f')
> +        return c - 'a' + 10;
> +    return -1;
> +}
> +
> +uint32_t vkd3d_parse_integer(const char *s)
> +{
> +    uint32_t base = 10, ret = 0;
> +    int digit;
> +
> +    if (*s == '0')
> +    {
> +        base = 8;
> +        ++s;
> +        if (*s == 'x' || *s == 'X')
> +        {
> +            base = 16;
> +            ++s;
> +        }
> +    }
> +
> +    while ((digit = char_to_int(*s++)) >= 0)
> +        ret = ret * base + (uint32_t)digit;
> +    return ret;
> +}
> +
>   void vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer)
>   {
>       buffer->buffer_size = 16;
> diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
> index 29e178cc..8bde5523 100644
> --- a/libs/vkd3d-shader/vkd3d_shader_private.h
> +++ b/libs/vkd3d-shader/vkd3d_shader_private.h
> @@ -1035,6 +1035,8 @@ static inline size_t bytecode_get_size(struct vkd3d_bytecode_buffer *buffer)
>       return buffer->size;
>   }
>   
> +uint32_t vkd3d_parse_integer(const char *s);
> +
>   struct vkd3d_shader_message_context
>   {
>       enum vkd3d_shader_log_level log_level;



More information about the wine-devel mailing list