[PATCH vkd3d] vkd3d-shader: Allow a NULL buffer in vkd3d_string_buffer.

Giovanni Mascellani gmascellani at codeweavers.com
Thu Oct 7 02:32:59 CDT 2021


Hi,

Il 06/10/21 16:54, Zebediah Figura (she/her) ha scritto:
>> Mmh, I am not sure I understand why that would lessen the boilerplate. 
>> You still need to name and destroy the string buffer, each of which 
>> takes a line. And vkd3d_string_buffer_data(string) is definitely 
>> longer than string->buffer. I don't really think this helps here.
> 
> Well, it lessens the boilerplate if you no longer need to check for 
> success from hlsl_type_to_string().

In this form, you still have to check for the result of 
hlsl_type_to_string. My patch doesn't change the fact that 
hlsl_type_to_string can still return NULL if it cannot allocate the 
vkd3d_string_buffer as a whole. Notice that my patch deals with the 
buffer field of vkd3d_string_buffer being NULL, but the whole structure 
still needs to be correctly allocated.

(en passant, I also notice that hlsl_type_to_string has insufficient 
error checking: it doesn't check the return value of 
vkd3d_string_buffer_prints, so if allocations fails there it will return 
an empty string; this doesn't lead to UB, but it generates a bad error 
message, which is still a bug, although much smaller)

> I mean, it's very convenient to be able to not have to check for success 
> from an allocation, in some way or another, if you're going to be doing 
> that frequently. vkd3d_string_buffer_data() achieves that, so I think 
> it's useful to see that as an end goal of vkd3d_string_buffer_data() in 
> itself, and to take advantage of it to get rid of ubiquitous error 
> checking.

Well, I guess this can be added as an additional goal, but we're not 
there yet. Taking this example of the error boilerplate:

>                 struct vkd3d_string_buffer *string;
> 
>                 string = hlsl_type_to_string(ctx, $3);
>                 if (string)
>                     hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
>                             "Matrix base type %s is not scalar.", vkd3d_string_buffer_data(string));
>                 hlsl_release_string_buffer(ctx, string);
>                 YYABORT;

You cannot remove the "if (string)", because hlsl_type_to_string can 
still return NULL, and vkd3d_string_buffer_data wouldn't like it (no 
problems if string->buffer is NULL, but segfault if string itself is NULL).

It's true that vkd3d_string_buffer_data might be replaced with something 
like:

> static inline const char *vkd3d_string_buffer_data(const struct vkd3d_string_buffer *buffer)
> {
>     return buffer && buffer->buffer ? buffer->buffer : "";
> }

In this case it would work as you say, though it would risk to generate 
a bad error message: "Matrix base type  is not scalar.". As I said, less 
grave than UB, but still a bug. If you want to really achieve what you 
say, it seems to me that more hack^W engineering is required (and I am 
not against it).

Giovanni.



More information about the wine-devel mailing list