From: Ian Arkver <ian.arkver.dev@gmail.com>
To: Hans Verkuil <hverkuil@xs4all.nl>,
Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>,
Mauro Carvalho Chehab <mchehab@infradead.org>,
Maxime Ripard <maxime.ripard@bootlin.com>,
Paul Kocialkowski <paul.kocialkowski@bootlin.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Chen-Yu Tsai <wens@csie.org>,
devel@driverdev.osuosl.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH] media: cedrus: don't initialize pointers with zero
Date: Fri, 7 Dec 2018 12:27:09 +0000 [thread overview]
Message-ID: <948a841b-efde-b43c-9532-abf72c7a6a97@gmail.com> (raw)
In-Reply-To: <4a2f5566-c021-ed9c-a9f0-03d6bcd894d0@xs4all.nl>
On 07/12/2018 11:37, Hans Verkuil wrote:
> On 12/07/2018 12:31 PM, Mauro Carvalho Chehab wrote:
>> Em Fri, 7 Dec 2018 12:14:50 +0100
>> Hans Verkuil <hverkuil@xs4all.nl> escreveu:
>>
>>> On 12/07/2018 11:56 AM, Mauro Carvalho Chehab wrote:
>>>> A common mistake is to assume that initializing a var with:
>>>> struct foo f = { 0 };
>>>>
>>>> Would initialize a zeroed struct. Actually, what this does is
>>>> to initialize the first element of the struct to zero.
>>>>
>>>> According to C99 Standard 6.7.8.21:
>>>>
>>>> "If there are fewer initializers in a brace-enclosed
>>>> list than there are elements or members of an aggregate,
>>>> or fewer characters in a string literal used to initialize
>>>> an array of known size than there are elements in the array,
>>>> the remainder of the aggregate shall be initialized implicitly
>>>> the same as objects that have static storage duration."
>>>>
>>>> So, in practice, it could zero the entire struct, but, if the
>>>> first element is not an integer, it will produce warnings:
>>>>
>>>> drivers/staging/media/sunxi/cedrus/cedrus.c:drivers/staging/media/sunxi/cedrus/cedrus.c:78:49: warning: Using plain integer as NULL pointer
>>>> drivers/staging/media/sunxi/cedrus/cedrus_dec.c:drivers/staging/media/sunxi/cedrus/cedrus_dec.c:29:35: warning: Using plain integer as NULL pointer
>>>>
>>>> A proper way to initialize it with gcc is to use:
>>>>
>>>> struct foo f = { };
>>>>
>>>> But that seems to be a gcc extension. So, I decided to check upstream
>>>
>>> No, this is not a gcc extension. It's part of the latest C standard.
>>
>> Sure? Where the C standard spec states that? I've been seeking for
>> such info for a while, as '= {}' is also my personal preference.
>
> I believe it was added in C11, but I've loaned the book that stated
> that to someone else, so I can't check.
Sadly I don't see mention of empty initializer lists in section 6.7.9 of
ISO/IEC 9899:2011, though I've only got a draft version.
I had a play with Compiler Explorer[1] and it seems like clang is OK
with the {} form though just out of interest msvc isn't. I didn't try
exploring other command line options.
[1] https://gcc.godbolt.org/z/XIDC7W
Regards,
Ian
>
> In any case, it's used everywhere:
>
> git grep '= *{ *}' drivers/
>
> So it is really pointless to *not* use it.
>
> Regards,
>
> Hans
>
>> I tried to build the Kernel with clang, just to be sure that this
>> won't cause issues with the clang support, but, unfortunately, the
>> clang compiler (not even the upstream version) is able to build
>> the upstream Kernel yet, as it lacks asm-goto support (there is an
>> OOT patch for llvm solving it - but it sounds too much effort for
>> my time to have to build llvm from their sources just for a simple
>> check like this).
>>
>>> It's used all over in the kernel, so please use {} instead of { NULL }.
>>>
>>> Personally I think {} is a fantastic invention and I wish C++ had it as
>>> well.
>>
>> Fully agreed on that.
>>
>>>
>>> Regards,
>>>
>>> Hans
>>>
>>>> what's the most commonly pattern. The gcc pattern has about 2000 entries:
>>>>
>>>> $ git grep -E "=\s*\{\s*\}"|wc -l
>>>> 1951
>>>>
>>>> The standard-C compliant pattern has about 2500 entries:
>>>>
>>>> $ git grep -E "=\s*\{\s*NULL\s*\}"|wc -l
>>>> 137
>>>> $ git grep -E "=\s*\{\s*0\s*\}"|wc -l
>>>> 2323
>>>>
>>>> So, let's initialize those structs with:
>>>> = { NULL }
>>>>
>>>> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
>>>> ---
>>>> drivers/staging/media/sunxi/cedrus/cedrus.c | 2 +-
>>>> drivers/staging/media/sunxi/cedrus/cedrus_dec.c | 2 +-
>>>> 2 files changed, 2 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
>>>> index b538eb0321d8..44c45c687503 100644
>>>> --- a/drivers/staging/media/sunxi/cedrus/cedrus.c
>>>> +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
>>>> @@ -75,7 +75,7 @@ static int cedrus_init_ctrls(struct cedrus_dev *dev, struct cedrus_ctx *ctx)
>>>> memset(ctx->ctrls, 0, ctrl_size);
>>>>
>>>> for (i = 0; i < CEDRUS_CONTROLS_COUNT; i++) {
>>>> - struct v4l2_ctrl_config cfg = { 0 };
>>>> + struct v4l2_ctrl_config cfg = { NULL };
>>>>
>>>> cfg.elem_size = cedrus_controls[i].elem_size;
>>>> cfg.id = cedrus_controls[i].id;
>>>> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
>>>> index e40180a33951..4099a42dba2d 100644
>>>> --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
>>>> +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
>>>> @@ -26,7 +26,7 @@ void cedrus_device_run(void *priv)
>>>> {
>>>> struct cedrus_ctx *ctx = priv;
>>>> struct cedrus_dev *dev = ctx->dev;
>>>> - struct cedrus_run run = { 0 };
>>>> + struct cedrus_run run = { NULL };
>>>> struct media_request *src_req;
>>>> unsigned long flags;
>>>>
>>>>
>>>
>>
>>
>>
>> Thanks,
>> Mauro
>>
>
next prev parent reply other threads:[~2018-12-07 12:27 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-07 10:56 [PATCH] media: cedrus: don't initialize pointers with zero Mauro Carvalho Chehab
2018-12-07 11:14 ` Hans Verkuil
2018-12-07 11:31 ` Mauro Carvalho Chehab
2018-12-07 11:37 ` Hans Verkuil
2018-12-07 12:27 ` Ian Arkver [this message]
2018-12-07 12:58 ` Mauro Carvalho Chehab
2018-12-07 13:22 ` Dan Carpenter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=948a841b-efde-b43c-9532-abf72c7a6a97@gmail.com \
--to=ian.arkver.dev@gmail.com \
--cc=devel@driverdev.osuosl.org \
--cc=gregkh@linuxfoundation.org \
--cc=hverkuil@xs4all.nl \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-media@vger.kernel.org \
--cc=maxime.ripard@bootlin.com \
--cc=mchehab+samsung@kernel.org \
--cc=mchehab@infradead.org \
--cc=paul.kocialkowski@bootlin.com \
--cc=wens@csie.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).