[libvirt] [PATCH] virStringListLength: Ensure const correctness

Cole Robinson crobinso at redhat.com
Tue Feb 9 20:47:30 UTC 2016


On 02/09/2016 01:19 PM, Andrea Bolognani wrote:
> On Tue, 2016-02-09 at 18:18 +0100, Michal Privoznik wrote:
>> The virStringListLength function does not ever modify the passed
>> string list. It merely counts the items in it. Make sure that we
>> reflect this bit in the function header.
>>  
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>  
>> This is hugely driven by a compilation error observed after the latest Martin
>> revert (ea913d185df9). I'm seeing this compilation error:
>>  
>> util/virpolkit.c: In function 'virPolkitCheckAuth':
>> util/virpolkit.c:93:47: error: passing argument 1 of 'virStringListLength' from incompatible pointer type [-Werror]
>>                             virStringListLength(details) / 2,
>>                                                 ^
>> In file included from util/virpolkit.c:33:0:
>> util/virstring.h:204:8: note: expected 'char **' but argument is of type 'const char **'
>>   size_t virStringListLength(char **strings);
>>  
>> But for some reason, implicit typecast from char ** to const char ** nor const
>> char * const * is allowed by gcc. I don't really understand why, so if anybody
>> has some explanation, please do explain.
> 
> Nitpick: you're using both
> 
>   (const char * const *) var
> 
> and
> 
>   (const char * const *)var
> 
> in your patch: both are used across libvirt's codebase, so please
> pick one and stick to that.
> 
> I've looked for answers on the Internet, as you do, and I've stumbled
> upon this entry from the C FAQ:
> 
>   http://c-faq.com/ansi/constmismatch.html
> 
> Now, having to explicitly cast when calling the function definitely
> sucks, but I don't really see a way around it at the moment; plus
> doing the opposite and casting a const pointer to a non-const pointer
> looks like a step in the wrong direction.
> 
> That said, I'd like to hear more opinions so weak ACK with the
> whitespace inconsistency fixed and the following squashed in.
> 
> Cheers.
> 
> 
> diff --git a/src/storage/storage_backend_sheepdog.c b/src/storage/storage_backend_sheepdog.c
> index 1200813..264ccc8 100644
> --- a/src/storage/storage_backend_sheepdog.c
> +++ b/src/storage/storage_backend_sheepdog.c
> @@ -167,7 +167,8 @@ virStorageBackendSheepdogRefreshAllVol(virConnectPtr conn ATTRIBUTE_UNUSED,
>  
>          cells = virStringSplit(line, " ", 0);
>  
> -        if (cells != NULL && virStringListLength(cells) > 2) {
> +        if (cells != NULL &&
> +            virStringListLength((const char * const *) cells) > 2) {
>              if (virStorageBackendSheepdogAddVolume(conn, pool, cells[1]) < 0)
>                  goto cleanup;
>          }

Since this is breaking the default build for me, I squashed in that hunk and
settled on '(cast)variable' spacing and pushed this patch.

Thanks,
Cole




More information about the libvir-list mailing list