Re: [PATCH] libssp: Fix gets-chk.c compilation on Solaris

2024-02-06 Thread Jakub Jelinek
On Tue, Feb 06, 2024 at 11:33:17AM +0100, Rainer Orth wrote:
> 2023-12-07  Rainer Orth  
> 
>   libssp:
>   * configure.ac (AC_CHECK_DECLS): Check for gets.
>   * configure, config.h.in: Regenerate.
>   * gets-chk.c (gets): Guard declaration with !HAVE_DECL_GETS.

Ok, thanks.

Jakub



Re: [PATCH] libssp: Fix gets-chk.c compilation on Solaris

2024-02-06 Thread Rainer Orth
Hi Jakub,

sorry for dropping the ball on this.

> On Mon, Dec 04, 2023 at 11:42:09AM +0100, Rainer Orth wrote:
>> The recent warning patches broke the libssp build on Solaris:
>> 
>> /vol/gcc/src/hg/master/local/libssp/gets-chk.c: In function '__gets_chk':
>> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:67:12: error: implicit
>> declaration of function 'gets'; did you mean 'getw'?
>> [-Wimplicit-function-declaration]
>>67 | return gets (s);
>>   |^~~~
>>   |getw 
>> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:67:12: error: returning
>> 'int' from a function with return type 'char *' makes pointer from
>> integer without a cast [-Wint-conversion]
>>67 | return gets (s);
>>   |^~~~
>> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:74:12: error: returning
>> 'int' from a function with return type 'char *' makes pointer from
>> integer without a cast [-Wint-conversion]
>>74 | return gets (s);
>>   |^~~~
>> 
>> The guard around the gets declaration in gets-chk.c is
>> 
>> #if !(!defined __USE_ISOC11 \
>>   || (defined __cplusplus && __cplusplus <= 201103L))
>> extern char *gets (char *);
>> #endif
>> 
>> __USE_ISOC11 is a glibc-only thing, while Solaris 
>> declares gets like
>> 
>> #if __STDC_VERSION__ < 201112L && __cplusplus < 201402L
>> extern char *gets(char *) __ATTR_DEPRECATED;
>> #endif
>> 
>> If one needs to check __USE_ISO11 at all, one certainly needs to check
>> __STDC_VERSION__ to avoid breaking every non-glibc target.  Besides, I
>> don't see what's the use of checking __cplusplus when compiling a C-only
>> source file.  On top of all that, the double negation makes the guard
>> unnecessarily hard to understand.
>> 
>> I really don't know if it's useful/appropriate to check __USE_ISOC11 and
>> __cplusplus here at all; still I've left both for now.
>> 
>> Here's what I've used to complete the Solaris bootstrap.
>> 
>> Tested on i386-pc-solaris2.11, sparc-sun-solaris2.11,
>> x86_64-pc-linux-gnu, and x86_64-apple-darwin23.1.0.
>> 
>> -- 
>> -
>> Rainer Orth, Center for Biotechnology, Bielefeld University
>> 
>> 
>> 2023-12-03  Rainer Orth  
>> 
>>  libssp:
>>  * gets-chk.c (gets): Avoid double negation.
>>  Also check __STDC_VERSION__ >= 201112L.
>> 
>
>> # HG changeset patch
>> # Parent  334015ab01f6c0e5af821c1e9bc83b8677cc0bfb
>> libssp: Fix gets-chk.c compilation on Solaris
>> 
>> diff --git a/libssp/gets-chk.c b/libssp/gets-chk.c
>> --- a/libssp/gets-chk.c
>> +++ b/libssp/gets-chk.c
>> @@ -51,8 +51,9 @@ see the files COPYING3 and COPYING.RUNTI
>>  # include 
>>  #endif
>>  
>> -#if !(!defined __USE_ISOC11 \
>> -  || (defined __cplusplus && __cplusplus <= 201103L))
>> +#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L)   \
>> + || !defined __USE_ISOC11   \
>> + || (defined __cplusplus && __cplusplus >= 201402L)
>
> The above isn't equivalent.  Avoiding double negation would mean
> #if (defined __USE_ISOC11 \
>  && !(defined __cplusplus && __cplusplus <= 201103L))
> or
> #if (defined __USE_ISOC11 \
>  && (!defined __cplusplus || __cplusplus > 201103L))
> No?
> __USE_ISOC11 is defined as
> /* This is to enable the ISO C11 extension.  */
> #if (defined _ISOC11_SOURCE || defined _ISOC2X_SOURCE \
>  || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L))
> # define __USE_ISOC11   1
> #endif
> where _ISOC11_SOURCE or _ISOC2X_SOURCE are defined whenever _GNU_SOURCE
> is or when user defines them, or __USE_ISOC11 is also defined for
> if __cplusplus >= 201703L.
>
> Obviously, if you add that
>   (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L)
> it will mean it will be prototyped always (as I think we compile it without
> any -std= flags).
>
> What about using what we had for glibc (or even better, expect gets
> to be declared for glibc < 2.16) and use what you add for other libraries?
> The file is written and compiled as C, so we don't need to bother with C++
> though.
> So
> #if (defined (__GLIBC_PREREQ) \
>  ? (__GLIBC_PREREQ (2, 16) && defined (__USE_ISOC11)) \
>  : (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L))
> ?
>
>>  extern char *gets (char *);
>>  #endif

this doesn't even compile on non-glibc targets:

/vol/gcc/src/hg/master/local/libssp/gets-chk.c:55:24: error: missing binary 
operator before token "("
   55 |  ? (__GLIBC_PREREQ (2, 16) && defined (__USE_ISOC11))   
\
  |   

Unless one really wants to go for ugly contortions like

#ifdef __GLIBC_PREREQ
# if __GLIBC_PREREQ (2, 16) && defined (__USE_ISOC11)
#  define NEED_DECL_GETS
# endif
#elif defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L
#  define 

Re: [PATCH] libssp: Fix gets-chk.c compilation on Solaris

2023-12-07 Thread Jakub Jelinek
On Mon, Dec 04, 2023 at 11:42:09AM +0100, Rainer Orth wrote:
> The recent warning patches broke the libssp build on Solaris:
> 
> /vol/gcc/src/hg/master/local/libssp/gets-chk.c: In function '__gets_chk':
> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:67:12: error: implicit 
> declaration of function 'gets'; did you mean 'getw'? 
> [-Wimplicit-function-declaration]
>67 | return gets (s);
>   |^~~~
>   |getw 
> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:67:12: error: returning 'int' 
> from a function with return type 'char *' makes pointer from integer without 
> a cast [-Wint-conversion]   
>67 | return gets (s);
>   |^~~~
> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:74:12: error: returning 'int' 
> from a function with return type 'char *' makes pointer from integer without 
> a cast [-Wint-conversion]
>74 | return gets (s);
>   |^~~~
> 
> The guard around the gets declaration in gets-chk.c is
> 
> #if !(!defined __USE_ISOC11 \
>   || (defined __cplusplus && __cplusplus <= 201103L))
> extern char *gets (char *);
> #endif
> 
> __USE_ISOC11 is a glibc-only thing, while Solaris 
> declares gets like
> 
> #if __STDC_VERSION__ < 201112L && __cplusplus < 201402L
> extern char *gets(char *) __ATTR_DEPRECATED;
> #endif
> 
> If one needs to check __USE_ISO11 at all, one certainly needs to check
> __STDC_VERSION__ to avoid breaking every non-glibc target.  Besides, I
> don't see what's the use of checking __cplusplus when compiling a C-only
> source file.  On top of all that, the double negation makes the guard
> unnecessarily hard to understand.
> 
> I really don't know if it's useful/appropriate to check __USE_ISOC11 and
> __cplusplus here at all; still I've left both for now.
> 
> Here's what I've used to complete the Solaris bootstrap.
> 
> Tested on i386-pc-solaris2.11, sparc-sun-solaris2.11,
> x86_64-pc-linux-gnu, and x86_64-apple-darwin23.1.0.
> 
> -- 
> -
> Rainer Orth, Center for Biotechnology, Bielefeld University
> 
> 
> 2023-12-03  Rainer Orth  
> 
>   libssp:
>   * gets-chk.c (gets): Avoid double negation.
>   Also check __STDC_VERSION__ >= 201112L.
> 

> # HG changeset patch
> # Parent  334015ab01f6c0e5af821c1e9bc83b8677cc0bfb
> libssp: Fix gets-chk.c compilation on Solaris
> 
> diff --git a/libssp/gets-chk.c b/libssp/gets-chk.c
> --- a/libssp/gets-chk.c
> +++ b/libssp/gets-chk.c
> @@ -51,8 +51,9 @@ see the files COPYING3 and COPYING.RUNTI
>  # include 
>  #endif
>  
> -#if !(!defined __USE_ISOC11  \
> -  || (defined __cplusplus && __cplusplus <= 201103L))
> +#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L)\
> + || !defined __USE_ISOC11\
> + || (defined __cplusplus && __cplusplus >= 201402L)

The above isn't equivalent.  Avoiding double negation would mean
#if (defined __USE_ISOC11   \
 && !(defined __cplusplus && __cplusplus <= 201103L))
or
#if (defined __USE_ISOC11   \
 && (!defined __cplusplus || __cplusplus > 201103L))
No?
__USE_ISOC11 is defined as
/* This is to enable the ISO C11 extension.  */
#if (defined _ISOC11_SOURCE || defined _ISOC2X_SOURCE \
 || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L))
# define __USE_ISOC11   1
#endif
where _ISOC11_SOURCE or _ISOC2X_SOURCE are defined whenever _GNU_SOURCE
is or when user defines them, or __USE_ISOC11 is also defined for
if __cplusplus >= 201703L.

Obviously, if you add that
  (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L)
it will mean it will be prototyped always (as I think we compile it without
any -std= flags).

What about using what we had for glibc (or even better, expect gets
to be declared for glibc < 2.16) and use what you add for other libraries?
The file is written and compiled as C, so we don't need to bother with C++
though.
So
#if (defined (__GLIBC_PREREQ)   \
 ? (__GLIBC_PREREQ (2, 16) && defined (__USE_ISOC11))   \
 : (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L))
?

>  extern char *gets (char *);
>  #endif

Jakub



Re: [PATCH] libssp: Fix gets-chk.c compilation on Solaris

2023-12-07 Thread Rainer Orth
Rainer Orth  writes:

> The recent warning patches broke the libssp build on Solaris:
>
> /vol/gcc/src/hg/master/local/libssp/gets-chk.c: In function '__gets_chk':
> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:67:12: error: implicit
> declaration of function 'gets'; did you mean 'getw'?
> [-Wimplicit-function-declaration]
>67 | return gets (s);
>   |^~~~
>   |getw 
> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:67:12: error: returning
> 'int' from a function with return type 'char *' makes pointer from integer
> without a cast [-Wint-conversion]
>67 | return gets (s);
>   |^~~~
> /vol/gcc/src/hg/master/local/libssp/gets-chk.c:74:12: error: returning
> 'int' from a function with return type 'char *' makes pointer from integer
> without a cast [-Wint-conversion]
>74 | return gets (s);
>   |^~~~
>
> The guard around the gets declaration in gets-chk.c is
>
> #if !(!defined __USE_ISOC11 \
>   || (defined __cplusplus && __cplusplus <= 201103L))
> extern char *gets (char *);
> #endif
>
> __USE_ISOC11 is a glibc-only thing, while Solaris 
> declares gets like
>
> #if __STDC_VERSION__ < 201112L && __cplusplus < 201402L
> extern char *gets(char *) __ATTR_DEPRECATED;
> #endif
>
> If one needs to check __USE_ISO11 at all, one certainly needs to check
> __STDC_VERSION__ to avoid breaking every non-glibc target.  Besides, I
> don't see what's the use of checking __cplusplus when compiling a C-only
> source file.  On top of all that, the double negation makes the guard
> unnecessarily hard to understand.
>
> I really don't know if it's useful/appropriate to check __USE_ISOC11 and
> __cplusplus here at all; still I've left both for now.
>
> Here's what I've used to complete the Solaris bootstrap.
>
> Tested on i386-pc-solaris2.11, sparc-sun-solaris2.11,
> x86_64-pc-linux-gnu, and x86_64-apple-darwin23.1.0.

Ping?  It's only been four days, but without a fix Solaris bootstrap
remains broken.

In hindsight, I wonder if it wouldn't be better to just check for a gets
declaration using AC_CHECK_DECLS, rather than second-guessing what
guards various implementions use, even messing with
implementation-private macros...

Rainer

-- 
-
Rainer Orth, Center for Biotechnology, Bielefeld University


[PATCH] libssp: Fix gets-chk.c compilation on Solaris

2023-12-04 Thread Rainer Orth
The recent warning patches broke the libssp build on Solaris:

/vol/gcc/src/hg/master/local/libssp/gets-chk.c: In function '__gets_chk':
/vol/gcc/src/hg/master/local/libssp/gets-chk.c:67:12: error: implicit 
declaration of function 'gets'; did you mean 'getw'? 
[-Wimplicit-function-declaration]
   67 | return gets (s);
  |^~~~
  |getw 
/vol/gcc/src/hg/master/local/libssp/gets-chk.c:67:12: error: returning 'int' 
from a function with return type 'char *' makes pointer from integer without a 
cast [-Wint-conversion]   
   67 | return gets (s);
  |^~~~
/vol/gcc/src/hg/master/local/libssp/gets-chk.c:74:12: error: returning 'int' 
from a function with return type 'char *' makes pointer from integer without a 
cast [-Wint-conversion]
   74 | return gets (s);
  |^~~~

The guard around the gets declaration in gets-chk.c is

#if !(!defined __USE_ISOC11 \
  || (defined __cplusplus && __cplusplus <= 201103L))
extern char *gets (char *);
#endif

__USE_ISOC11 is a glibc-only thing, while Solaris 
declares gets like

#if __STDC_VERSION__ < 201112L && __cplusplus < 201402L
extern char *gets(char *) __ATTR_DEPRECATED;
#endif

If one needs to check __USE_ISO11 at all, one certainly needs to check
__STDC_VERSION__ to avoid breaking every non-glibc target.  Besides, I
don't see what's the use of checking __cplusplus when compiling a C-only
source file.  On top of all that, the double negation makes the guard
unnecessarily hard to understand.

I really don't know if it's useful/appropriate to check __USE_ISOC11 and
__cplusplus here at all; still I've left both for now.

Here's what I've used to complete the Solaris bootstrap.

Tested on i386-pc-solaris2.11, sparc-sun-solaris2.11,
x86_64-pc-linux-gnu, and x86_64-apple-darwin23.1.0.

-- 
-
Rainer Orth, Center for Biotechnology, Bielefeld University


2023-12-03  Rainer Orth  

libssp:
* gets-chk.c (gets): Avoid double negation.
Also check __STDC_VERSION__ >= 201112L.

# HG changeset patch
# Parent  334015ab01f6c0e5af821c1e9bc83b8677cc0bfb
libssp: Fix gets-chk.c compilation on Solaris

diff --git a/libssp/gets-chk.c b/libssp/gets-chk.c
--- a/libssp/gets-chk.c
+++ b/libssp/gets-chk.c
@@ -51,8 +51,9 @@ see the files COPYING3 and COPYING.RUNTI
 # include 
 #endif
 
-#if !(!defined __USE_ISOC11\
-  || (defined __cplusplus && __cplusplus <= 201103L))
+#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L)	\
+ || !defined __USE_ISOC11	\
+ || (defined __cplusplus && __cplusplus >= 201402L)
 extern char *gets (char *);
 #endif