diff --git a/programs/test/benchmark.c b/programs/test/benchmark.c
index 5985caf..8e22748 100644
--- a/programs/test/benchmark.c
+++ b/programs/test/benchmark.c
@@ -246,7 +246,7 @@
     unsigned long tsc;
     __asm   rdtsc
     __asm   mov  [tsc], eax
-    return( tsc );
+    return tsc ;
 }
 #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
           ( _MSC_VER && _M_IX86 ) || __WATCOMC__ */
@@ -262,7 +262,7 @@
 {
     unsigned long lo, hi;
     asm volatile( "rdtsc" : "=a" (lo), "=d" (hi) );
-    return( lo );
+    return lo ;
 }
 #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
           __GNUC__ && __i386__ */
@@ -276,7 +276,7 @@
 {
     unsigned long lo, hi;
     asm volatile( "rdtsc" : "=a" (lo), "=d" (hi) );
-    return( lo | ( hi << 32 ) );
+    return lo | ( hi << 32 ) ;
 }
 #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
           __GNUC__ && ( __amd64__ || __x86_64__ ) */
@@ -298,7 +298,7 @@
     }
     while( tbu0 != tbu1 );
 
-    return( tbl );
+    return tbl ;
 }
 #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
           __GNUC__ && ( __powerpc__ || __ppc__ ) */
@@ -315,7 +315,7 @@
 {
     unsigned long tick;
     asm volatile( "rdpr %%tick, %0;" : "=&r" (tick) );
-    return( tick );
+    return tick ;
 }
 #endif /* __OpenBSD__ */
 #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
@@ -331,7 +331,7 @@
     unsigned long tick;
     asm volatile( ".byte 0x83, 0x41, 0x00, 0x00" );
     asm volatile( "mov   %%g1, %0" : "=r" (tick) );
-    return( tick );
+    return tick ;
 }
 #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
           __GNUC__ && __sparc__ && !__sparc64__ */
@@ -345,7 +345,7 @@
 {
     unsigned long cc;
     asm volatile( "rpcc %0" : "=r" (cc) );
-    return( cc & 0xFFFFFFFF );
+    return cc & 0xFFFFFFFF ;
 }
 #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
           __GNUC__ && __alpha__ */
@@ -359,7 +359,7 @@
 {
     unsigned long itc;
     asm volatile( "mov %0 = ar.itc" : "=r" (itc) );
-    return( itc );
+    return itc ;
 }
 #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&
           __GNUC__ && __ia64__ */
@@ -476,7 +476,7 @@
         len -= use_len;
     }
 
-    return( 0 );
+    return 0 ;
 }
 
 #define CHECK_AND_CONTINUE( R )                                         \
@@ -523,10 +523,10 @@
     if( found != NULL )
     {
         *curve = *found;
-        return( 1 );
+        return 1 ;
     }
     else
-        return( 0 );
+        return 0 ;
 }
 #endif
 
diff --git a/programs/test/cmake_package/cmake_package.c b/programs/test/cmake_package/cmake_package.c
index 1ae627d..4263bd9 100644
--- a/programs/test/cmake_package/cmake_package.c
+++ b/programs/test/cmake_package/cmake_package.c
@@ -45,5 +45,5 @@
 
     mbedtls_printf( "Built against %s\n", version );
 
-    return( 0 );
+    return 0 ;
 }
diff --git a/programs/test/cmake_package_install/cmake_package_install.c b/programs/test/cmake_package_install/cmake_package_install.c
index 9d5d3e4..e8517ba 100644
--- a/programs/test/cmake_package_install/cmake_package_install.c
+++ b/programs/test/cmake_package_install/cmake_package_install.c
@@ -46,5 +46,5 @@
 
     mbedtls_printf( "Built against %s\n", version );
 
-    return( 0 );
+    return 0 ;
 }
diff --git a/programs/test/cmake_subproject/cmake_subproject.c b/programs/test/cmake_subproject/cmake_subproject.c
index ff6ebf0..6f9d383 100644
--- a/programs/test/cmake_subproject/cmake_subproject.c
+++ b/programs/test/cmake_subproject/cmake_subproject.c
@@ -46,5 +46,5 @@
 
     mbedtls_printf( "Built against %s\n", version );
 
-    return( 0 );
+    return 0 ;
 }
diff --git a/programs/test/query_compile_time_config.c b/programs/test/query_compile_time_config.c
index a6eaf61..e640335 100644
--- a/programs/test/query_compile_time_config.c
+++ b/programs/test/query_compile_time_config.c
@@ -43,8 +43,8 @@
     if ( argc != 2 )
     {
         mbedtls_printf( USAGE, argv[0] );
-        return( MBEDTLS_EXIT_FAILURE );
+        return MBEDTLS_EXIT_FAILURE ;
     }
 
-    return( query_config( argv[1] ) );
+    return query_config( argv[1] ) ;
 }
diff --git a/programs/test/selftest.c b/programs/test/selftest.c
index c7bcc53..72180bb 100644
--- a/programs/test/selftest.c
+++ b/programs/test/selftest.c
@@ -147,7 +147,7 @@
     mbedtls_free( empty2 );
     mbedtls_free( buffer1 );
     mbedtls_free( buffer2 );
-    return( failures );
+    return failures ;
 }
 #endif /* MBEDTLS_SELF_TEST */
 
@@ -165,10 +165,10 @@
         ref_ret != ret ||
         memcmp( buf + n, ref + n, sizeof( buf ) - n ) != 0 )
     {
-        return( 1 );
+        return 1 ;
     }
 
-    return( 0 );
+    return 0 ;
 }
 
 static int run_test_snprintf( void )
@@ -220,7 +220,7 @@
 #if defined(MBEDTLS_ENTROPY_NV_SEED) && !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
     create_entropy_seed_file( );
 #endif
-    return( mbedtls_entropy_self_test( verbose ) );
+    return mbedtls_entropy_self_test( verbose ) ;
 }
 #endif
 
@@ -235,7 +235,7 @@
 #endif
     }
     mbedtls_memory_buffer_alloc_free( );
-    return( mbedtls_memory_buffer_alloc_self_test( verbose ) );
+    return mbedtls_memory_buffer_alloc_self_test( verbose ) ;
 }
 #endif
 
diff --git a/programs/test/udp_proxy.c b/programs/test/udp_proxy.c
index 6546e8f..aa01562 100644
--- a/programs/test/udp_proxy.c
+++ b/programs/test/udp_proxy.c
@@ -332,41 +332,41 @@
 
 static const char *msg_type( unsigned char *msg, size_t len )
 {
-    if( len < 1 )                           return( "Invalid" );
+    if( len < 1 )                           return "Invalid" ;
     switch( msg[0] )
     {
-        case MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC:    return( "ChangeCipherSpec" );
-        case MBEDTLS_SSL_MSG_ALERT:                 return( "Alert" );
-        case MBEDTLS_SSL_MSG_APPLICATION_DATA:      return( "ApplicationData" );
-        case MBEDTLS_SSL_MSG_CID:                   return( "CID" );
+        case MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC:    return "ChangeCipherSpec" ;
+        case MBEDTLS_SSL_MSG_ALERT:                 return "Alert" ;
+        case MBEDTLS_SSL_MSG_APPLICATION_DATA:      return "ApplicationData" ;
+        case MBEDTLS_SSL_MSG_CID:                   return "CID" ;
         case MBEDTLS_SSL_MSG_HANDSHAKE:             break; /* See below */
-        default:                            return( "Unknown" );
+        default:                            return "Unknown" ;
     }
 
-    if( len < 13 + 12 )                     return( "Invalid handshake" );
+    if( len < 13 + 12 )                     return "Invalid handshake" ;
 
     /*
      * Our handshake message are less than 2^16 bytes long, so they should
      * have 0 as the first byte of length, frag_offset and frag_length.
      * Otherwise, assume they are encrypted.
      */
-    if( msg[14] || msg[19] || msg[22] )     return( "Encrypted handshake" );
+    if( msg[14] || msg[19] || msg[22] )     return "Encrypted handshake" ;
 
     switch( msg[13] )
     {
-        case MBEDTLS_SSL_HS_HELLO_REQUEST:          return( "HelloRequest" );
-        case MBEDTLS_SSL_HS_CLIENT_HELLO:           return( "ClientHello" );
-        case MBEDTLS_SSL_HS_SERVER_HELLO:           return( "ServerHello" );
-        case MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST:   return( "HelloVerifyRequest" );
-        case MBEDTLS_SSL_HS_NEW_SESSION_TICKET:     return( "NewSessionTicket" );
-        case MBEDTLS_SSL_HS_CERTIFICATE:            return( "Certificate" );
-        case MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE:    return( "ServerKeyExchange" );
-        case MBEDTLS_SSL_HS_CERTIFICATE_REQUEST:    return( "CertificateRequest" );
-        case MBEDTLS_SSL_HS_SERVER_HELLO_DONE:      return( "ServerHelloDone" );
-        case MBEDTLS_SSL_HS_CERTIFICATE_VERIFY:     return( "CertificateVerify" );
-        case MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE:    return( "ClientKeyExchange" );
-        case MBEDTLS_SSL_HS_FINISHED:               return( "Finished" );
-        default:                            return( "Unknown handshake" );
+        case MBEDTLS_SSL_HS_HELLO_REQUEST:          return "HelloRequest" ;
+        case MBEDTLS_SSL_HS_CLIENT_HELLO:           return "ClientHello" ;
+        case MBEDTLS_SSL_HS_SERVER_HELLO:           return "ServerHello" ;
+        case MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST:   return "HelloVerifyRequest" ;
+        case MBEDTLS_SSL_HS_NEW_SESSION_TICKET:     return "NewSessionTicket" ;
+        case MBEDTLS_SSL_HS_CERTIFICATE:            return "Certificate" ;
+        case MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE:    return "ServerKeyExchange" ;
+        case MBEDTLS_SSL_HS_CERTIFICATE_REQUEST:    return "CertificateRequest" ;
+        case MBEDTLS_SSL_HS_SERVER_HELLO_DONE:      return "ServerHelloDone" ;
+        case MBEDTLS_SSL_HS_CERTIFICATE_VERIFY:     return "CertificateVerify" ;
+        case MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE:    return "ClientKeyExchange" ;
+        case MBEDTLS_SSL_HS_FINISHED:               return "Finished" ;
+        default:                            return "Unknown handshake" ;
     }
 }
 
@@ -381,10 +381,10 @@
     {
         (void) mbedtls_timing_get_timer( &hires, 1 );
         initialized = 1;
-        return( 0 );
+        return 0 ;
     }
 
-    return( mbedtls_timing_get_timer( &hires, 0 ) );
+    return mbedtls_timing_get_timer( &hires, 0 ) ;
 }
 
 typedef struct
@@ -417,7 +417,7 @@
     buf->len           = 0;
     buf->num_datagrams = 0;
 
-    return( ret );
+    return ret ;
 }
 
 static unsigned ctx_buffer_time_remaining( ctx_buffer *buf )
@@ -425,12 +425,12 @@
     unsigned const cur_time = ellapsed_time();
 
     if( buf->num_datagrams == 0 )
-        return( (unsigned) -1 );
+        return (unsigned) -1 ;
 
     if( cur_time - buf->packet_lifetime >= opt.pack )
-        return( 0 );
+        return 0 ;
 
-    return( opt.pack - ( cur_time - buf->packet_lifetime ) );
+    return opt.pack - ( cur_time - buf->packet_lifetime ) ;
 }
 
 static int ctx_buffer_append( ctx_buffer *buf,
@@ -440,13 +440,13 @@
     int ret;
 
     if( len > (size_t) INT_MAX )
-        return( -1 );
+        return -1 ;
 
     if( len > sizeof( buf->data ) )
     {
         mbedtls_printf( "  ! buffer size %u too large (max %u)\n",
                         (unsigned) len, (unsigned) sizeof( buf->data ) );
-        return( -1 );
+        return -1 ;
     }
 
     if( sizeof( buf->data ) - buf->len < len )
@@ -454,7 +454,7 @@
         if( ( ret = ctx_buffer_flush( buf ) ) <= 0 )
         {
             mbedtls_printf( "ctx_buffer_flush failed with -%#04x", (unsigned int) -ret );
-            return( ret );
+            return ret ;
         }
     }
 
@@ -464,7 +464,7 @@
     if( ++buf->num_datagrams == 1 )
         buf->packet_lifetime = ellapsed_time();
 
-    return( (int) len );
+    return (int) len ;
 }
 #endif /* MBEDTLS_TIMING_C */
 
@@ -483,9 +483,9 @@
             buf = &outbuf[1];
 
         if( buf == NULL )
-            return( -1 );
+            return -1 ;
 
-        return( ctx_buffer_append( buf, data, len ) );
+        return ctx_buffer_append( buf, data, len ) ;
     }
 #endif /* MBEDTLS_TIMING_C */
 
@@ -494,7 +494,7 @@
     {
         mbedtls_printf( "net_send returned -%#04x\n", (unsigned int) -ret );
     }
-    return( ret );
+    return ret ;
 }
 
 typedef struct
@@ -578,7 +578,7 @@
         if( ( ret = dispatch_data( dst, buf, p->len ) ) <= 0 )
         {
             mbedtls_printf( "  ! dispatch returned %d\n", ret );
-            return( ret );
+            return ret ;
         }
     }
 
@@ -602,7 +602,7 @@
         if( ( ret = dispatch_data( dst, buf, p->len ) ) <= 0 )
         {
             mbedtls_printf( "  ! dispatch returned %d\n", ret );
-            return( ret );
+            return ret ;
         }
     }
 
@@ -610,7 +610,7 @@
     if( ( ret = dispatch_data( dst, p->buf, p->len ) ) <= 0 )
     {
         mbedtls_printf( "  ! dispatch returned %d\n", ret );
-        return( ret );
+        return ret ;
     }
 
     /* Don't duplicate Application Data, only handshake covered */
@@ -623,7 +623,7 @@
         if( ( ret = dispatch_data( dst, p->buf, p->len ) ) <= 0 )
         {
             mbedtls_printf( "  ! dispatch returned %d\n", ret );
-            return( ret );
+            return ret ;
         }
     }
 
@@ -638,13 +638,13 @@
                                         initial_clihlo.len ) ) <= 0 )
         {
             mbedtls_printf( "  ! dispatch returned %d\n", ret );
-            return( ret );
+            return ret ;
         }
 
         inject_clihlo_state = ICH_INJECTED;
     }
 
-    return( 0 );
+    return 0 ;
 }
 
 #define MAX_DELAYED_MSG 5
@@ -673,11 +673,11 @@
     {
         ret = send_packet( &prev[offset], "delayed" );
         if( ret != 0 )
-            return( ret );
+            return ret ;
     }
 
     clear_pending();
-    return( 0 );
+    return 0 ;
 }
 
 /*
@@ -713,7 +713,7 @@
     if( ( ret = mbedtls_net_recv( src, cur.buf, sizeof( cur.buf ) ) ) <= 0 )
     {
         mbedtls_printf( "  ! mbedtls_net_recv returned %d\n", ret );
-        return( ret );
+        return ret ;
     }
 
     cur.len  = ret;
@@ -751,7 +751,7 @@
             mbedtls_free( delay_list[delay_idx] );
             delay_list[delay_idx] = NULL;
 
-            return( 0 );
+            return 0 ;
         }
     }
 
@@ -787,15 +787,15 @@
     {
         /* forward and possibly duplicate */
         if( ( ret = send_packet( &cur, "forwarded" ) ) != 0 )
-            return( ret );
+            return ret ;
 
         /* send previously delayed messages if any */
         ret = send_delayed();
         if( ret != 0 )
-            return( ret );
+            return ret ;
     }
 
-    return( 0 );
+    return 0 ;
 }
 
 int main( int argc, char *argv[] )
