Re: [PATCH 0/1] Add returns_twice attribute to setjmp()

"Richard Earnshaw (lists)" <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
On 30/09/2025 15:49, Joel Sherrill wrote:
> Hi
> 
> This patch set cover letter is longer than usual because even though
> the change is small, the rationale for the change is complicated.
> 
> This patch adds the "returns_twice" attribute to setjmp(). This attribute
> is related to the processing of -Wclobbered. -Wclobbered is enabled
> as part of -Wextra and documented as follows:
> 
> '-Wclobbered'
>      Warn for variables that might be changed by 'longjmp' or 'vfork'.
>      This warning is also enabled by '-Wextra'.
> 
> I believe vfork() probably also needs the "returns_twice" attribute but
> that function is not supported by RTEMS so I did not have any test cases
> to verify the change against.

I'm not sure that's the same.  vfork creates two processes, but each process returns only once.

R.

> 
> The "returns_twice" attribute was introduced in GCC in 2005 by this
> commit. Given how long ago this was added, I did not see any need to
> conditionalize the use on GCC version.
> 
> commit 6e9a32219ba643ca53c2b68822f0eddbf3280503
> Author: Alexey Neyman <[email protected]>
> Date:   Tue Mar 8 13:19:40 2005 +0000
> 
>     re PR c/14411 (Request for setjmp/longjmp attributes)
>     
>             PR c/14411
>             * calls.c (flags_from_decl_or_type): Handle eturns_twice' attribute.
>             * c-common.c (handle_returns_twice): New function.
>             (c_common_attribute_table): Declare eturns_twice' attribute.
>             * doc/extend.texi: Document eturns_twice' attribute.
>             * tree.h (DECL_IS_RETURNS_TWICE): New macro.
>             (struct tree_decl): Add returns_twice_flag.
>     
>     From-SVN: r96101
> 
> The "returns_twice" attribute is documented by GCC as follows:
> 
> returns_twice'
>      The 'returns_twice' attribute tells the compiler that a function
>      may return more than one time.  The compiler ensures that all
>      registers are dead before calling such a function and emits a
>      warning about the variables that may be clobbered after the second
>      return from the function.  Examples of such functions are 'setjmp'
>      and 'vfork'.  The 'longjmp'-like counterpart of such function, if
>      any, might need to be marked with the 'noreturn' attribute.
> 
> RTEMS had about 25 -wclobbered warnings across the entire source base.
> Adding this attribute addressed all but two of the them. We modified 
> both of those cases to address the warning and ensure any variables
> used were safe from being clobbered.
> 
> -Wclobbered warns about code where it is hard to see what is wrong.
> The Linux man page for setjmp() includes this:
> 
> 
>        The  compiler  may  optimize  variables  into  registers, and
>        longjmp() may restore the values of other registers in  addi‐
>        tion to the stack pointer and program counter.  Consequently,
>        the values of automatic variables  are  unspecified  after  a
>        call to longjmp() if they meet all the following criteria:
> 
>        •  they are local to the function that made the corresponding
>           setjmp() call;
> 
>        •  their values are changed between the calls to setjmp() and
>           longjmp(); and
> 
>        •  they are not declared as volatile.
> 
>        Analogous remarks apply for siglongjmp().
> Joel Sherrill (1):
>   newlib/libc/include/setjmp.h: Add returns_twice attribute to setjmp()
> 
>  newlib/libc/include/setjmp.h | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.