qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v6] error: rename errp to errp_in where it is IN-argument


From: Markus Armbruster
Subject: Re: [PATCH v6] error: rename errp to errp_in where it is IN-argument
Date: Fri, 29 Nov 2019 17:03:56 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.2 (gnu/linux)

Vladimir Sementsov-Ogievskiy <address@hidden> writes:

> 29.11.2019 17:35, Markus Armbruster wrote:
>> Vladimir Sementsov-Ogievskiy <address@hidden> writes:
>> 
>>> 28.11.2019 23:29, Markus Armbruster wrote:
>>>> Vladimir Sementsov-Ogievskiy <address@hidden> writes:
>>>>
>>>>> 28.11.2019 17:23, Markus Armbruster wrote:
>>>>>> Vladimir Sementsov-Ogievskiy <address@hidden> writes:
>>>>>>
>>>>>>> Error **errp is almost always OUT-argument: it's assumed to be NULL, or
>>>>>>> pointer to NULL-initialized pointer, or pointer to error_abort or
>>>>>>> error_fatal, for callee to report error.
>>>>>>>
>>>>>>> But very few functions instead get Error **errp as IN-argument:
>>>>>>> it's assumed to be set (or, maybe, NULL), and callee should clean it,
>>>>>>> or add some information.
>>>>>>>
>>>>>>> In such cases, rename errp to errp_in.
>>>>>>
>>>>>> Missing: why is the rename useful?
>>>>>
>>>>> The main reason is to prepare for coccinelle part.
>>>>
>>>> It's not a prerequisite for applying the patches Coccinelle produces,
>>>> only a prerequisite for running Coccinelle.
>>>>
>>>>>> It's useful if it helps readers recognize unusual Error ** parameters,
>>>>>> and recognizing unusual Error ** parameters is actually a problem.  I'm
>>>>>> not sure it is, but my familiarity with the Error interface may blind
>>>>>> me.
>>>>>>
>>>>>> How many functions have unusual Error **parameters?  How are they used?
>>>>>> Any calls that could easily be mistaken as the usual case?  See [*]
>>>>>> below.
>> [...]
>>>>>> [*] The information I asked for above is buried in these patches.  I'll
>>>>>> try to dig it up as I go reviewing them.
>>>>>>
>>>>>> Second, it risks some of these "further patches" overtake this one, and
>>>>>> then its commit message will be misleading.  Moreover, the other commits
>>>>>> will lack context.
>> [...]
>>>>>>> diff --git a/util/error.c b/util/error.c
>>>>>>> index d4532ce318..275586faa8 100644
>>>>>>> --- a/util/error.c
>>>>>>> +++ b/util/error.c
>> [...]
>>>>>>> @@ -271,11 +271,11 @@ void error_free(Error *err)
>>>>>>>         }
>>>>>>>     }
>>>>>>>     
>>>>>>> -void error_free_or_abort(Error **errp)
>>>>>>> +void error_free_or_abort(Error **errp_in)
>>>>>>>     {
>>>>>>> -    assert(errp && *errp);
>>>>>>> -    error_free(*errp);
>>>>>>> -    *errp = NULL;
>>>>>>> +    assert(errp_in && *errp_in);
>>>>>>> +    error_free(*errp_in);
>>>>>>> +    *errp_in = NULL;
>>>>
>>>> This one is actually in/out.
>>>>
>>>> To make the compiler check errp_in is truly an in-argument, we can
>>>> declare it as Error *const *errp_in.
>>>>
>>>> But we can save ourselves the trouble of renaming it; the const should
>>>> suffice to tell both human readers and Coccinelle that this is not your
>>>> common out-argument.  I think I like this better than relying on a
>>>> naming convention.  What about you?
>>>
>>> I think it's good idea... But what to do with error_free_or_abort, and 
>>> other functions
>>> which get filled errp, and want to set it to NULL? Patch 21 adds three such 
>>> functions..
>>>
>>> Maybe, add assert(errp) at start of such functions, and catch it by 
>>> coccinelle (not sure
>>> that it is possible)?
>> 
>> I went through the git branch you provided.
>> 
>> These get rid of unusual Error ** parameters:
>> 
>>      01e10667d1 hmp: drop Error pointer indirection in hmp_handle_error
>>      606bfb7520 vnc: drop Error pointer indirection in vnc_client_io_error
>> 
>>      Get rid of them by peeling off an indirection.
>> 
>> These try to make unusual Error ** parameters stand out:
>> 
>>      51e73b3305 error: rename errp to errp_in where it is IN-argument
>> 
>>      Four renames.
>> 
>>      Three functions modify the error, name @errp_in is okay, my const
>>      proposal works.
>> 
>>      error_free_or_abort() clears *errp_in, name @errp_in is misleading,
>>      const doesn't work.
>> 
>>      f7bdfd42da qdev-monitor: well form error hint helpers
>> 
>>      Two renames.  Both functions modify the error, rename is okay, const
>>      works.
>> 
>>      9d4aac7299 nbd: well form nbd_iter_channel_error errp handler
>> 
>>      One rename, from @local_err.  nbd_iter_channel_error() clears *errp_in,
>>      name @errp_in is misleading, const doesn't work.
>> 
>>      fb1bd83c40 ppc: well form kvmppc_hint_smt_possible error hint helper
>> 
>>      One rename.  The function modify the error, rename is okay, const works.
>> 
>>      e024e89b10 9pfs: well form error hint helpers
>> 
>>      Two renames.  Both functions modify the error, rename is okay, const
>>      works.
>> 
>> These make usual Error ** parameters look, well, more usual:
>> 
>>      c01649d999 hw/core/qdev: cleanup Error ** variables
>>      a5f6424163 block/snapshot: rename Error ** parameter to more common errp
>>      ae200ca21e hw/i386/amd_iommu: rename Error ** parameter to more common 
>> errp
>>      561f73e681 qga: rename Error ** parameter to more common errp
>>      12589a96cd monitor/qmp-cmds: rename Error ** parameter to more common 
>> errp
>>      f608fc5999 hw/s390x: rename Error ** parameter to more common errp
>>      747a90d044 hw/tpm: rename Error ** parameter to more common errp
>>      3d19e66610 hw/usb: rename Error ** parameter to more common errp
>>      07366648ef include/qom/object.h: rename Error ** parameter to more 
>> common errp
>> 
>> These don't touch Error ** parameter declarations:
>> 
>>      f6e4fffc16 hw/core/loader-fit: fix freeing errp in fit_load_fdt
>>      b5bba880ae net/net: Clean up variable shadowing in net_client_init()
>>      4a4462ce4c hw/sd: drop extra whitespace in sdhci_sysbus_realize() header
>>      d52d44e822 backends/cryptodev: drop local_err from 
>> cryptodev_backend_complete()
>>      7e95d30766 hw/vfio/ap: drop local_err from vfio_ap_realize
>> 
>> Unusual Error ** parameters that can be made Error *const *errp should
>> not also need a rename, neither to avoid confusion about @errp's role,
>> nor to help Coccinelle.
>> 
>> Unusual Error ** parameters that can't be made Error *const *errp:
>> 
>>      nbd_iter_channel_error(): parameter is called @local_err.  Confusion
>>      seems as unlikely without the rename as with it.  Coccinelle should
>>      not need the rename.  No need to touch.  I'm willing to accept your
>>      assertion change.
>
> Hmm but you reverted it.. Will you keep an assertion?

You decide whether to change the assertion in v7.

>>      error_free_or_abort(): parameter is called @errp.  Confusion seems
>>      as unlikely without the rename as with it.  Coccinelle should not
>>      need the rename.  I'm willing to accept a rename to @local_err
>>      regardless.
>
> So, either we rename it to local_err, or coccinelle should distinguish it
> by assertion at the top.

Yes.

I'm also willing to consider a rename to a name other than @local_err,
if you can come up with a good, non-misleading one.

>> I pushed my fixups to git://repo.or.cz/qemu/armbru.git branch error-prep
>> for your convenience.  The commit messages of the fixed up commits need
>> rephrasing, of course.
>> 
>
> Looked through fixups, looks OK for me, thanks! What next?

Let me finish my fixing incorrect dereferences of errp, and then we
figure out what to include in v7.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]