From 8faceb4ba4c66069a03fc03a57d8b0af03dfbefc Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Fri, 11 Jun 2010 23:46:29 +0100 Subject: [PATCH] Add AFS_NORETURN macro and use it Add the AFS_NORETURN macro which can be used with gcc compatible compilers to indicate that a particular funciton prototype will not return control to the caller. This both improves code quality, and helps with static analysis. Use this to flag afsmon_Exit, db_panic, osi_Panic, Abort, Exit and the error handlers for osi_Assert and our local assert fn all as being noreturn. Change-Id: Ic6c4ae319af3d6f7665c9ee5072b556c01850982 Reviewed-on: http://gerrit.openafs.org/2134 Reviewed-by: Russ Allbery Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/afsmonitor/afsmonitor.h | 2 +- src/budb/database.h | 2 +- src/config/stds.h | 2 ++ src/rx/rx_prototypes.h | 9 +++++---- src/util/assert.h | 2 +- src/vol/salvaged.c | 1 - src/vol/vnode.c | 2 +- src/vol/vol-salvage.c | 2 +- src/vol/vol-salvage.h | 2 +- 9 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/afsmonitor/afsmonitor.h b/src/afsmonitor/afsmonitor.h index 38292a05e..db6e5f0fc 100644 --- a/src/afsmonitor/afsmonitor.h +++ b/src/afsmonitor/afsmonitor.h @@ -109,6 +109,6 @@ extern int cm_refresh(int, int); extern int gtx_initialize(void); /* afsmonitor.c */ -extern int afsmon_Exit(int a_exitVal); +extern int afsmon_Exit(int a_exitVal) AFS_NORETURN; #endif /* AFSMONITOR_H */ diff --git a/src/budb/database.h b/src/budb/database.h index 3d3484d3c..e192cf67c 100644 --- a/src/budb/database.h +++ b/src/budb/database.h @@ -320,5 +320,5 @@ extern dbadr ht_LookupBucket(struct ubik_trans *ut, extern afs_int32 dbwrite(struct ubik_trans *ut, afs_int32 pos, void *buff, afs_int32 len); extern afs_int32 dbread(struct ubik_trans *ut, afs_int32 pos, void *buff, afs_int32 len); extern afs_int32 cdbread(struct ubik_trans *ut, int type, afs_int32 pos, void *buff, afs_int32 len); -extern void db_panic(char *reason); +extern void db_panic(char *reason) AFS_NORETURN; extern void ht_Reset(struct memoryHashTable *mht); diff --git a/src/config/stds.h b/src/config/stds.h index 90f966152..fcc151796 100644 --- a/src/config/stds.h +++ b/src/config/stds.h @@ -336,9 +336,11 @@ hdr_static_inline(unsigned long) afs_printable_uint32_lu(afs_uint32 d) { return #if !defined(__GNUC__) || __GNUC__ < 2 #define AFS_UNUSED #define AFS_ATTRIBUTE_FORMAT(style,x,y) +#define AFS_NORETURN #else #define AFS_UNUSED __attribute__((unused)) #define AFS_ATTRIBUTE_FORMAT(style,x,y) __attribute__((format(style, x, y))) +#define AFS_NORETURN __attribute__((__noreturn__)); #endif #endif /* OPENAFS_CONFIG_AFS_STDS_H */ diff --git a/src/rx/rx_prototypes.h b/src/rx/rx_prototypes.h index 58f2c94de..cf2d8ac26 100644 --- a/src/rx/rx_prototypes.h +++ b/src/rx/rx_prototypes.h @@ -383,7 +383,8 @@ extern osi_socket rxi_GetHostUDPSocket(u_int host, u_short port); extern void osi_Panic(char *fmt, void *a1, void *a2, void *a3); # else extern void osi_Panic(char *fmt, ...) - AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2); + AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2) + AFS_NORETURN; #endif extern int osi_utoa(char *buf, size_t len, unsigned long val); extern void rxi_InitPeerParams(struct rx_peer *pp); @@ -403,7 +404,7 @@ extern int rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host, # ifdef UKERNEL extern void *rx_ServerProc(void *); # endif -extern void osi_AssertFailK(const char *expr, const char *file, int line); +extern void osi_AssertFailK(const char *expr, const char *file, int line) AFS_NORETURN; extern void rxk_ListenerProc(void); extern void rxk_Listener(void); # ifndef UKERNEL @@ -613,7 +614,7 @@ extern afs_kmutex_t rx_if_init_mutex; extern afs_kmutex_t rx_if_mutex; #endif extern osi_socket rxi_GetUDPSocket(u_short port); -extern void osi_AssertFailU(const char *expr, const char *file, int line); +extern void osi_AssertFailU(const char *expr, const char *file, int line) AFS_NORETURN; extern void rxi_InitPeerParams(struct rx_peer *pp); extern int rxi_HandleSocketError(int socket); @@ -626,7 +627,7 @@ extern void osi_Free(void *x, afs_int32 size); #endif #endif /* defined(AFS_AIX32_ENV) && !defined(KERNEL) */ #ifndef KERNEL -extern void osi_Panic(char *fmt, ...); +extern void osi_Panic(char *fmt, ...) AFS_NORETURN; #endif extern void rx_GetIFInfo(void); diff --git a/src/util/assert.h b/src/util/assert.h index a8c2555a2..dcb7fd883 100644 --- a/src/util/assert.h +++ b/src/util/assert.h @@ -10,6 +10,6 @@ /* @(#)assert.h 1.1 83/08/01 SMI; from UCB 4.1 83/05/03 */ /* Modified to dump core, rather than exit. May/85 RNS */ -void AssertionFailed(char *file, int line); +void AssertionFailed(char *file, int line) AFS_NORETURN; #define assert(ex) do{if (!(ex)) AssertionFailed(__FILE__, __LINE__);}while(0) diff --git a/src/vol/salvaged.c b/src/vol/salvaged.c index 07e78b4ee..d073f8963 100644 --- a/src/vol/salvaged.c +++ b/src/vol/salvaged.c @@ -134,7 +134,6 @@ /* Forward declarations */ /*@printflike@*/ void Log(const char *format, ...); -/*@printflike@*/ void Abort(const char *format, ...); /*@+fcnmacros +macrofcndecl@*/ diff --git a/src/vol/vnode.c b/src/vol/vnode.c index a5f69572f..8824f3735 100644 --- a/src/vol/vnode.c +++ b/src/vol/vnode.c @@ -70,7 +70,7 @@ /*@printflike@*/ extern void Log(const char *format, ...); -/*@printflike@*/ extern void Abort(const char *format, ...); +/*@printflike@*/ extern void Abort(const char *format, ...) AFS_NORETURN; struct VnodeClassInfo VnodeClassInfo[nVNODECLASSES]; diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index d0571e8a7..e4faefce2 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -306,7 +306,7 @@ char *tmpdir = NULL; /* Forward declarations */ /*@printflike@*/ void Log(const char *format, ...); -/*@printflike@*/ void Abort(const char *format, ...); +/*@printflike@*/ void Abort(const char *format, ...) AFS_NORETURN; static int IsVnodeOrphaned(VnodeId vnode); static int AskVolumeSummary(VolumeId singleVolumeNumber); diff --git a/src/vol/vol-salvage.h b/src/vol/vol-salvage.h index e68ea4d22..41e36a1ee 100644 --- a/src/vol/vol-salvage.h +++ b/src/vol/vol-salvage.h @@ -217,7 +217,7 @@ extern int canfork; /* prototypes */ -extern void Exit(int code); +extern void Exit(int code) AFS_NORETURN; extern int Fork(void); extern int Wait(char *prog); extern char *ToString(const char *s); -- 2.39.5