All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] makecontext.3: Fix function declarator with empty parentheses.
@ 2021-03-04 19:45 Alejandro Colomar
       [not found] ` <CAKCAbMg3G4EAeuUhN9EQTDnrTSD0sPoH0uH1=kkpfj9qYorPdg@mail.gmail.com>
  0 siblings, 1 reply; 6+ messages in thread
From: Alejandro Colomar @ 2021-03-04 19:45 UTC (permalink / raw)
  To: mtk.manpages; +Cc: Alejandro Colomar, linux-man, libc-alpha

glibc uses 'void (*f)(void)' for makecontext()'s second parameter.

C11 marked function declarators with empty parentheses as
obsolescent:


>   6.11.6  Function declarators
> 1 The use of function declarators with empty parentheses (not
>   prototype-format parametertype declarators) is an obsolescent
>   feature.


Let's use the correct syntax by explicitly using '(void)'.

.../glibc$ grep_glibc_prototype makecontext
stdlib/ucontext.h:51:
extern void makecontext (ucontext_t *__ucp, void (*__func) (void),
			 int __argc, ...) __THROW;
.../glibc$

Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>
---
 man3/makecontext.3 | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/man3/makecontext.3 b/man3/makecontext.3
index 83720dd2c..ac9afcf69 100644
--- a/man3/makecontext.3
+++ b/man3/makecontext.3
@@ -32,7 +32,8 @@ makecontext, swapcontext \- manipulate user context
 .nf
 .B #include <ucontext.h>
 .PP
-.BI "void makecontext(ucontext_t *" ucp ", void (*" func ")(), int " argc ", ...);"
+.BI "void makecontext(ucontext_t *" ucp ", void (*" func ")(void), int " argc \
+", ...);"
 .BI "int swapcontext(ucontext_t *" oucp ", const ucontext_t *" ucp );
 .fi
 .SH DESCRIPTION
-- 
2.30.1.721.g45526154a5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] makecontext.3: Fix function declarator with empty parentheses.
       [not found] ` <CAKCAbMg3G4EAeuUhN9EQTDnrTSD0sPoH0uH1=kkpfj9qYorPdg@mail.gmail.com>
@ 2021-03-04 21:10   ` Florian Weimer
  2021-03-05  1:13     ` Alejandro Colomar (man-pages)
  0 siblings, 1 reply; 6+ messages in thread
From: Florian Weimer @ 2021-03-04 21:10 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: Alejandro Colomar, linux-man, libc-alpha, mtk.manpages

* Zack Weinberg:

> This is actually the Austin Group’s primary rationale for deprecating
> makecontext and its relatives.

That's a bit surprising because open and fcntl have a similar problem:
the argument type before the ellipsis cannot be int.

And doesn't a later C standard add a generic function pointer type?

Thanks,
Florian


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] makecontext.3: Fix function declarator with empty parentheses.
  2021-03-04 21:10   ` Florian Weimer
@ 2021-03-05  1:13     ` Alejandro Colomar (man-pages)
  2021-03-05 10:21       ` Florian Weimer
  0 siblings, 1 reply; 6+ messages in thread
From: Alejandro Colomar (man-pages) @ 2021-03-05  1:13 UTC (permalink / raw)
  To: Florian Weimer, Zack Weinberg, mtk.manpages; +Cc: linux-man, libc-alpha

Hello Zack, Florian, Michael,

On 3/4/21 8:45 PM, Alejandro Colomar wrote:
> glibc uses 'void (*f)(void)' for makecontext()'s second parameter.
>
> C11 marked function declarators with empty parentheses as
> obsolescent:
>
>
>>   6.11.6  Function declarators
>> 1 The use of function declarators with empty parentheses (not
>>   prototype-format parameter type declarators) is an obsolescent
>>   feature.

I quoted C11, but it's also in C99 (same section 6.11.6.1) and in C89
(in section 3.9.4) with the same wording.

>
>
> Let's use the correct syntax by explicitly using '(void)'.
>
> .../glibc$ grep_glibc_prototype makecontext
> stdlib/ucontext.h:51:
> extern void makecontext (ucontext_t *__ucp, void (*__func) (void),
> 			 int __argc, ...) __THROW;
> .../glibc$
>
> Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>
> ---


On 3/4/21 9:10 PM, Zack Weinberg wrote:
> On Thu, Mar 4, 2021 at 2:48 PM Alejandro Colomar via Libc-alpha
> <libc-alpha@sourceware.org <mailto:libc-alpha@sourceware.org>> wrote:
>
>     glibc uses 'void (*f)(void)' for makecontext()'s second parameter.
>
>
> Did you mean ‘void (*f)()’ ?

I did actually mean 'void (*f)(void)'.  Glibc uses that for the
prototype (as you can see from my commit message (see above)), and as I
confirmed just now, it also uses that type for the definition of the
function:

[
.../glibc$ grep -rn '^makecontext\s*('
stdlib/makecontext.c:22:makecontext (ucontext_t *ucp, void (*func)
(void), int argc, ...)
.../glibc$
]

However, I should have read the manual page (I must admit that I only
read the SYNOPSIS and EXAMPLES sections of the manual page and the glibc
source before writing the patch).  It's clear that the prototype that
was being used in the manual page was more correct (in the sense that it
more accurately represented the actual expected function pointer) than
the glibc prototype (eventhough the glibc prototype is more standards
conforming).

So my patch is wrong.

Florian, should I file a bug in glibc's bugzilla?

>
>     C11 marked function declarators with empty parentheses as
>     obsolescent:
>
>
>     >   6.11.6  Function declarators
>     > 1 The use of function declarators with empty parentheses (not
>     >   prototype-format parametertype declarators) is an obsolescent
>     >   feature.
>
>
>     Let's use the correct syntax by explicitly using '(void)
>
>
> Unfortunately this change would be incorrect. makecontext’s second
> parameter really is a pointer to a function that takes any number and
> type of arguments, and there is no other way to write that in C than
> ‘void (*)()’. Which, yes, means this function cannot be declared in
> conformant C11.

Yes, you're completely right!  Thanks for noticing.


On 3/4/21 10:10 PM, Florian Weimer wrote:
> * Zack Weinberg:
> 
>> This is actually the Austin Group’s primary rationale for deprecating
>> makecontext and its relatives.
> 
> That's a bit surprising because open and fcntl have a similar problem:
> the argument type before the ellipsis cannot be int.
> 
> And doesn't a later C standard add a generic function pointer type?

Ahh, I found it.  It's not in any standard, yet, but we might see it
soon in C2x: <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2230.htm>

Actually, one of the proposals is to reuse the empty parentheses for
this generic function pointer (thus removing it as a valid function
declaration), so the current prototype used in the manual page would
still be correct.

Another proposal is to add 'funcptr_t' for that, which seems to be
compatible with older standards.

You could even use it in glibc.


Michael, please ignore this patch.


Thank you all,

Alex

-- 
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] makecontext.3: Fix function declarator with empty parentheses.
  2021-03-05  1:13     ` Alejandro Colomar (man-pages)
@ 2021-03-05 10:21       ` Florian Weimer
  2021-03-05 10:27         ` Andreas Schwab
  2021-03-05 12:48         ` Alejandro Colomar (man-pages)
  0 siblings, 2 replies; 6+ messages in thread
From: Florian Weimer @ 2021-03-05 10:21 UTC (permalink / raw)
  To: Alejandro Colomar (man-pages)
  Cc: Zack Weinberg, mtk.manpages, linux-man, libc-alpha

* Alejandro Colomar:

> I did actually mean 'void (*f)(void)'.  Glibc uses that for the
> prototype (as you can see from my commit message (see above)), and as I
> confirmed just now, it also uses that type for the definition of the
> function:
>
> [
> .../glibc$ grep -rn '^makecontext\s*('
> stdlib/makecontext.c:22:makecontext (ucontext_t *ucp, void (*func)
> (void), int argc, ...)
> .../glibc$
> ]
>
> However, I should have read the manual page (I must admit that I only
> read the SYNOPSIS and EXAMPLES sections of the manual page and the glibc
> source before writing the patch).  It's clear that the prototype that
> was being used in the manual page was more correct (in the sense that it
> more accurately represented the actual expected function pointer) than
> the glibc prototype (eventhough the glibc prototype is more standards
> conforming).
>
> So my patch is wrong.
>
> Florian, should I file a bug in glibc's bugzilla?

I don't know.  SUSv2 has (void *func) (), which would make this a glibc
bug.  I'm not sure if I have easy access to POSIX.1 from 2001, which I
believe still has this function.

I am not sure if all glibc implementations of makecontext can be used to
call variadic functions.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] makecontext.3: Fix function declarator with empty parentheses.
  2021-03-05 10:21       ` Florian Weimer
@ 2021-03-05 10:27         ` Andreas Schwab
  2021-03-05 12:48         ` Alejandro Colomar (man-pages)
  1 sibling, 0 replies; 6+ messages in thread
From: Andreas Schwab @ 2021-03-05 10:27 UTC (permalink / raw)
  To: Florian Weimer via Libc-alpha
  Cc: Alejandro Colomar (man-pages), Florian Weimer, linux-man, mtk.manpages

On Mär 05 2021, Florian Weimer via Libc-alpha wrote:

> I don't know.  SUSv2 has (void *func) (), which would make this a glibc
> bug.  I'm not sure if I have easy access to POSIX.1 from 2001, which I
> believe still has this function.

https://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] makecontext.3: Fix function declarator with empty parentheses.
  2021-03-05 10:21       ` Florian Weimer
  2021-03-05 10:27         ` Andreas Schwab
@ 2021-03-05 12:48         ` Alejandro Colomar (man-pages)
  1 sibling, 0 replies; 6+ messages in thread
From: Alejandro Colomar (man-pages) @ 2021-03-05 12:48 UTC (permalink / raw)
  To: Florian Weimer
  Cc: Zack Weinberg, mtk.manpages, linux-man, libc-alpha, Andreas Schwab

Hi Florian,

On 3/5/21 11:21 AM, Florian Weimer wrote:
> * Alejandro Colomar:
>> Florian, should I file a bug in glibc's bugzilla?
> 
> I don't know.  SUSv2 has (void *func) (), which would make this a glibc
> bug.  I'm not sure if I have easy access to POSIX.1 from 2001, which I
> believe still has this function.
> 
> I am not sure if all glibc implementations of makecontext can be used to
> call variadic functions.

I reported the bug: <https://sourceware.org/bugzilla/show_bug.cgi?id=27523>

Thanks,

Alex

-- 
Alejandro Colomar
Linux man-pages comaintainer; https://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-03-05 12:49 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-04 19:45 [PATCH] makecontext.3: Fix function declarator with empty parentheses Alejandro Colomar
     [not found] ` <CAKCAbMg3G4EAeuUhN9EQTDnrTSD0sPoH0uH1=kkpfj9qYorPdg@mail.gmail.com>
2021-03-04 21:10   ` Florian Weimer
2021-03-05  1:13     ` Alejandro Colomar (man-pages)
2021-03-05 10:21       ` Florian Weimer
2021-03-05 10:27         ` Andreas Schwab
2021-03-05 12:48         ` Alejandro Colomar (man-pages)

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.