[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