[Openvpn-devel,RFC] fix warning with gcc 12.2.0 (compiler bug?)

Message ID 20221127085933.3487177-1-arne@rfc2549.org
State New
Headers show
Series [Openvpn-devel,RFC] fix warning with gcc 12.2.0 (compiler bug?) | expand

Commit Message

Arne Schwabe Nov. 27, 2022, 8:59 a.m. UTC
Changing the argument of check_malloc_return from const void* to void*
removes the warning from gcc 12.2.0:

In file included from ../../../openvpn-git/src/openvpn/crypto_openssl.c:40:
../../../openvpn-git/src/openvpn/buffer.h: In function ‘hmac_ctx_new’:
../../../openvpn-git/src/openvpn/buffer.h:1030:9: warning: ‘ctx’ may be used uninitialized [-Wmaybe-uninitialized]
 1030 |         check_malloc_return((dptr) = (type *) malloc(sizeof(type))); \
      |         ^~~~~~~~~~~~~~~~~~~
../../../openvpn-git/src/openvpn/buffer.h:1076:1: note: by argument 1 of type ‘const void *’ to ‘check_malloc_return’ declared here
 1076 | check_malloc_return(const void *p)
      | ^~~~~~~~~~~~~~~~~~~

This more a quick fix/heads up for other people encountering the issue
on GCC 12.2.0 like on Ubuntu 22.10 until we figure out if this is a bug in
our code or a compiler bug.

Signed-off-by: Arne Schwabe <arne@rfc2549.org>
---
 src/openvpn/buffer.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Frank Lichtenheld March 30, 2023, 1:19 p.m. UTC | #1
On Sun, Nov 27, 2022 at 09:59:33AM +0100, Arne Schwabe wrote:
> Changing the argument of check_malloc_return from const void* to void*
> removes the warning from gcc 12.2.0:
> 
> In file included from ../../../openvpn-git/src/openvpn/crypto_openssl.c:40:
> ../../../openvpn-git/src/openvpn/buffer.h: In function ‘hmac_ctx_new’:
> ../../../openvpn-git/src/openvpn/buffer.h:1030:9: warning: ‘ctx’ may be used uninitialized [-Wmaybe-uninitialized]
>  1030 |         check_malloc_return((dptr) = (type *) malloc(sizeof(type))); \
>       |         ^~~~~~~~~~~~~~~~~~~
> ../../../openvpn-git/src/openvpn/buffer.h:1076:1: note: by argument 1 of type ‘const void *’ to ‘check_malloc_return’ declared here
>  1076 | check_malloc_return(const void *p)
>       | ^~~~~~~~~~~~~~~~~~~
> 
> This more a quick fix/heads up for other people encountering the issue
> on GCC 12.2.0 like on Ubuntu 22.10 until we figure out if this is a bug in
> our code or a compiler bug.
> 
> Signed-off-by: Arne Schwabe <arne@rfc2549.org>
> ---
>  src/openvpn/buffer.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/openvpn/buffer.h b/src/openvpn/buffer.h
> index fece6336d..9ad281562 100644
> --- a/src/openvpn/buffer.h
> +++ b/src/openvpn/buffer.h
> @@ -1073,7 +1073,7 @@ gc_reset(struct gc_arena *a)
>      }
>  
>  static inline void
> -check_malloc_return(const void *p)
> +check_malloc_return(void *p)
>  {
>      if (!p)
>      {

Seen this with gcc 11.3 on Ubuntu 22.04 as well. It only seems to occur
on -O0, probably since check_malloc_return will be inlined otherwise.

I would suggest to go ahead with applying the patch. While I think that
in our specific case it is a false-positive, the general assumption
"a const pointer to a clearly uninitialized area is not useful" is
valid in general. Testing the pointer for NULL like we do is literally
the one and only thing you can do with it.

On anything other than -O0 it will make no difference anyway. And removing
the const is much less ugly than to add some pragmas for gcc to suppress
the warning.

So:
Acked-By: Frank Lichtenheld <frank@lichtenheld.com>

Regards,

Patch

diff --git a/src/openvpn/buffer.h b/src/openvpn/buffer.h
index fece6336d..9ad281562 100644
--- a/src/openvpn/buffer.h
+++ b/src/openvpn/buffer.h
@@ -1073,7 +1073,7 @@  gc_reset(struct gc_arena *a)
     }
 
 static inline void
-check_malloc_return(const void *p)
+check_malloc_return(void *p)
 {
     if (!p)
     {