]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
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 38292a05ee493ac0339824747aa49b4cd3a6124b..db6e5f0fc1c6cd1e8dd4b5202e24813fd7925e29 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 3d3484d3c2d6b26576b949a56fe7fcbbe8233983..e192cf67c3d74071685032dd2beade5c97d1e180 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 90f966152efb52550fca7b5fa78ae2316c72956c..fcc15179652a5e18fb25538f8d5c003dae040ab1 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 58f2c94de0bb5a21bba1546e592e34854677a15e..cf2d8ac2632fbe8903212ab0565f62a5f06274ce 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 a8c2555a2eee07d19520104441a2e59afb673bcb..dcb7fd8830180752f83153c5bcc19383ca4f1226 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 07e78b4ee9250a13728c6b9ef2132e7ca046c1a9..d073f8963f160feba267f30e045a851896388e54 100644 (file)
 
 /* Forward declarations */
 /*@printflike@*/ void Log(const char *format, ...);
-/*@printflike@*/ void Abort(const char *format, ...);
 
 
 /*@+fcnmacros +macrofcndecl@*/
index a5f69572f3f7a723aa00ed00d1add992f9aa43a7..8824f373526ea87651b00e997ce5e0a943708962 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 d0571e8a733c4c2dada013efa5af889a32052923..e4faefce206d324ea9cca8e3e6fc0f554b164755 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 e68ea4d2239f35437245efa617c1b179edfd2d27..41e36a1eea2bd9864ecb7cfe9f5b400d72f04932 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);