Re: [patch] memusage.1, bind.2, eventfd.2, futex.2, open_by_handle_at.2, perf_event_open.2, poll.2, signalfd.2, sysctl.2, timerfd_create.2, bsearch.3, cmsg.3, getaddrinfo.3, getaddrinfo_a.3 getgrouplist.3, insque.3, malloc_info.3, mbsinit.3, mbstowcs.3, pthread_create.3, pthread_setaffinity_np.3, queue.3, rtnetlink.3, shm_open.3, strptime.3, tsearch.3, aio.7, fanotify.7, inotify.7, unix.7: Use sizeof consistently

Michael Kerrisk (man-pages)
2020-08-25T10:29:30Z

Hello Alex,

On 8/24/20 3:29 PM, Alejandro Colomar wrote:
>>From 5df5cae0fb6973df0ab8b3629934f808487112b0 Mon Sep 17 00:00:00 2001
> From: Alejandro Colomar <colomar.6.4.3@gmail.com>
> Date: Fri, 21 Aug 2020 16:58:12 +0200
> Subject: [PATCH] memusage.1, bind.2, eventfd.2, futex.2,
> open_by_handle_at.2,
> perf_event_open.2, poll.2, signalfd.2, sysctl.2, timerfd_create.2,
> bsearch.3,
> cmsg.3, getaddrinfo.3, getaddrinfo_a.3 getgrouplist.3, insque.3,
> malloc_info.3, mbsinit.3, mbstowcs.3, pthread_create.3,
> pthread_setaffinity_np.3, queue.3, rtnetlink.3, shm_open.3, strptime.3,
> tsearch.3, aio.7, fanotify.7, inotify.7, unix.7: Use sizeof consistently
>
> Use ``sizeof`` consistently through all the examples, in the following
> way:

I would really have preferred three patches here, since:

> - Never use a space after ``sizeof``, and always use parentheses
> instead.
>
> Rationale:
>
> https://www.kernel.org/doc/html/v5.8/process/coding-style.html#spaces

(1) This is completely unproblematic from my point of view.

> - Use the name of the variable instead of the type as argument
> for ``sizeof``, wherever possible.
>
> Rationale:
>
> https://www.kernel.org/doc/html/v5.8/process/coding-style.html#allocating-memory

(2) This one is up for debate. In many cases it makes sense to do
this. However, there are cases where I think that using the struct
name can actually help readability. And when I grep through the kernel
source, of around 139k lines that use "sizeof", some 37k take a 'struct type'
as an argument. SI, I think this kind of change may need to be considered on
a case by case basis, rather than as a blanket change.

> - When the result of ``sizeof`` is multiplied (or otherwise modified),
> write ``sizeof`` in the first place.
>
> Rationale:
>
> ``(sizeof(x) * INT_MAX * 2)`` doesn't overflow.
>
> ``(INT_MAX * 2 * sizeof(x))`` overflows, giving incorrect
> results.

(3) Is this true? "gcc -Wall" does not complain about this. And, I
thought that in both cases, all operands in the expression
would be promoted to the largest type. And, on my x86-64 system,

sizeof((sizeof(x) * INT_MAX * 2)) == 8
sizeof(INT_MAX * 2 * sizeof(x)) == 8

But, I will say tht I'm not a language lawyer, and C still
sometimes has surprises for me. At the least, I'd like to know
more about this point.

Thanks,

Michael

--
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/