Add AFS_NORETURN macro and use it
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Fri, 11 Jun 2010 22:46:29 +0000 (23:46 +0100)
committerDerrick Brashear <shadow@dementia.org>
Sun, 13 Jun 2010 05:33:34 +0000 (22:33 -0700)
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 <rra@stanford.edu>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afsmonitor/afsmonitor.h
src/budb/database.h
src/config/stds.h
src/rx/rx_prototypes.h
src/util/assert.h
src/vol/salvaged.c
src/vol/vnode.c
src/vol/vol-salvage.c
src/vol/vol-salvage.h

index 38292a0..db6e5f0 100644 (file)
@@ -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 */
index 3d3484d..e192cf6 100644 (file)
@@ -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);
index 90f9661..fcc1517 100644 (file)
@@ -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 */
index 58f2c94..cf2d8ac 100644 (file)
@@ -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);
index a8c2555..dcb7fd8 100644 (file)
@@ -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)
index 07e78b4..d073f89 100644 (file)
 
 /* Forward declarations */
 /*@printflike@*/ void Log(const char *format, ...);
-/*@printflike@*/ void Abort(const char *format, ...);
 
 
 /*@+fcnmacros +macrofcndecl@*/
index a5f6957..8824f37 100644 (file)
@@ -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];
index d0571e8..e4faefc 100644 (file)
@@ -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);
 
index e68ea4d..41e36a1 100644 (file)
@@ -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);