[Asterisk-cvs] asterisk/include/asterisk channel.h, 1.68, 1.69 utils.h, 1.14, 1.15

markster at lists.digium.com markster at lists.digium.com
Sat Jan 8 12:56:18 CST 2005


Update of /usr/cvsroot/asterisk/include/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv7306/include/asterisk

Modified Files:
	channel.h utils.h 
Log Message:
Warn if flags is signed instead of unsigned (bug #3279)


Index: channel.h
===================================================================
RCS file: /usr/cvsroot/asterisk/include/asterisk/channel.h,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -d -r1.68 -r1.69
--- channel.h	8 Jan 2005 17:23:29 -0000	1.68
+++ channel.h	8 Jan 2005 19:00:46 -0000	1.69
@@ -218,7 +218,7 @@
 	unsigned int pickupgroup;
 
 	/*! channel flags of AST_FLAG_ type */
-	int flags;
+	unsigned int flags;
 	
 	/*! For easy linking */
 	struct ast_channel *next;
@@ -251,7 +251,7 @@
 	char *end_sound;
 	char *start_sound;
 	int firstpass;
-	int flags;
+	unsigned int flags;
 };
 
 struct chanmon;

Index: utils.h
===================================================================
RCS file: /usr/cvsroot/asterisk/include/asterisk/utils.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- utils.h	3 Jan 2005 00:51:57 -0000	1.14
+++ utils.h	8 Jan 2005 19:00:46 -0000	1.15
@@ -18,19 +18,76 @@
 #include <asterisk/lock.h>
 #include <limits.h>
 
-#define ast_test_flag(p,flag) 		((p)->flags & (flag))
+/* Note:
+   It is very important to use only unsigned variables to hold
+   bit flags, as otherwise you can fall prey to the compiler's
+   sign-extension antics if you try to use the top two bits in
+   your variable.
 
-#define ast_set_flag(p,flag)		((p)->flags |= (flag))
+   The flag macros below use a set of compiler tricks to verify
+   that the caller is using an "unsigned int" variable to hold
+   the flags, and nothing else. If the caller uses any other
+   type of variable, a warning message similar to this:
 
-#define ast_clear_flag(p,flag)		((p)->flags &= ~(flag))
+   warning: comparison of distinct pointer types lacks cast
 
-#define ast_copy_flags(dest,src,flagz)	do { (dest)->flags &= ~(flagz); \
-					(dest)->flags |= ((src)->flags & (flagz)); } while(0)
+   will be generated.
 
-#define ast_set2_flag(p,value,flag)	((value) ? ast_set_flag(p,flag) : ast_clear_flag(p,flag))	
+   The "dummy" variable below is used to make these comparisons.
+
+   Also note that at -O2 or above, this type-safety checking
+   does _not_ produce any additional object code at all.
+*/
+
+extern unsigned int __unsigned_int_flags_dummy;
+
+#define ast_test_flag(p,flag) 		({ \
+					typeof ((p)->flags) __p = (p)->flags; \
+					typeof (__unsigned_int_flags_dummy) __x = 0; \
+					(void) (&__p == &__x); \
+					((p)->flags & (flag)); \
+					})
+
+#define ast_set_flag(p,flag) 		do { \
+					typeof ((p)->flags) __p = (p)->flags; \
+					typeof (__unsigned_int_flags_dummy) __x = 0; \
+					(void) (&__p == &__x); \
+					((p)->flags |= (flag)); \
+					} while(0)
+
+#define ast_clear_flag(p,flag) 		do { \
+					typeof ((p)->flags) __p = (p)->flags; \
+					typeof (__unsigned_int_flags_dummy) __x = 0; \
+					(void) (&__p == &__x); \
+					((p)->flags &= ~(flag)); \
+					} while(0)
+
+#define ast_copy_flags(dest,src,flagz)	do { \
+					typeof ((dest)->flags) __d = (dest)->flags; \
+					typeof ((src)->flags) __s = (src)->flags; \
+					typeof (__unsigned_int_flags_dummy) __x = 0; \
+					(void) (&__d == &__x); \
+					(void) (&__s == &__x); \
+					(dest)->flags &= ~(flagz); \
+					(dest)->flags |= ((src)->flags & (flagz)); \
+					} while (0)
+
+#define ast_set2_flag(p,value,flag)	do { \
+					typeof ((p)->flags) __p = (p)->flags; \
+					typeof (__unsigned_int_flags_dummy) __x = 0; \
+					(void) (&__p == &__x); \
+					if (value) \
+						(p)->flags |= (flag); \
+					else \
+						(p)->flags &= ~(flag); \
+					} while (0)
 
 #define AST_FLAGS_ALL UINT_MAX
 
+struct ast_flags {
+	unsigned int flags;
+};
+
 static inline int ast_strlen_zero(const char *s)
 {
 	return (*s == '\0');
@@ -41,10 +98,6 @@
 	char buf[1024];
 };
 
-struct ast_flags {
-	unsigned int flags;
-};
-
 extern char *ast_strip(char *buf);
 extern struct hostent *ast_gethostbyname(const char *host, struct ast_hostent *hp);
 extern int ast_base64encode(char *dst, unsigned char *src, int srclen, int max);




More information about the svn-commits mailing list