Warn if flags is signed instead of unsigned (bug #3279)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4713 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer 2005-01-08 19:00:46 +00:00
parent 17acbf1e38
commit 87c9e1db33
4 changed files with 68 additions and 15 deletions

View File

@ -183,7 +183,7 @@ struct localuser {
int stillgoing;
int metric;
int oldstatus;
int flags; /* flag bits */
unsigned int flags; /* flag bits */
time_t lastcall;
struct member *member;
struct localuser *next;
@ -224,7 +224,7 @@ struct ast_call_queue {
char moh[80]; /* Name of musiconhold to be used */
char announce[80]; /* Announcement to play when call is answered */
char context[80]; /* Context for this queue */
int flags; /* flag bits */
unsigned int flags; /* flag bits */
int strategy; /* Queueing strategy */
int announcefrequency; /* How often to announce their position */
int roundingseconds; /* How many seconds do we round to? */

View File

@ -157,7 +157,7 @@ struct ast_vm_user {
char dialout[80];
char uniqueid[20]; /* Unique integer identifier */
char exit[80];
int flags; /* VM_ flags */
unsigned int flags; /* VM_ flags */
int saydurationm;
struct ast_vm_user *next;
};

View File

@ -218,7 +218,7 @@ struct ast_channel {
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 @@ struct ast_bridge_config {
char *end_sound;
char *start_sound;
int firstpass;
int flags;
unsigned int flags;
};
struct chanmon;

View File

@ -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 @@ struct ast_hostent {
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);