Using OpenSER-1.1.0-notls:
gcc -DNAME='"openser"' -DVERSION='"1.1.0-notls"' -DARCH='"i686"' -DOS='"linux"'
-DCOMPILER='"gcc 4.1.0"' -D__CPU_i686 -D__OS_linux -D__SMP_no -DCFG_DIR='"/usr/local/etc/openser/"' -DPKG_MALLOC
-DSHM_MEM -DSHM_MMAP -DUSE_IPV6 -DUSE_MCAST -DUSE_TCP -DDISABLE_NAGLE -DHAVE_RESOLV_RES -DSTATISTICS -DF_MALLOC -DHAVE_GETHOSTBYNAME2
-DHAVE_UNION_SEMUN -DHAVE_SCHED_YIELD -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H -DHAVE_TIMEGM -DUSE_SYSV_SEM
-DHAVE_EPOLL -DHAVE_SIGIO_RT -DHAVE_SELECT -c action.c -o action.o
Or, if I turn on extra debugging:
gcc -DNAME='"openser"' -DVERSION='"1.1.0-notls"' -DARCH='"i686"' -DOS='"linux"'
-DCOMPILER='"gcc 4.1.0"' -D__CPU_i686 -D__OS_linux -D__SMP_no -DCFG_DIR='"/usr/local/etc/openser/"' -DPKG_MALLOC
-DSHM_MEM -DSHM_MMAP -DUSE_IPV6 -DUSE_MCAST -DUSE_TCP -DDISABLE_NAGLE -DHAVE_RESOLV_RES -DSTATISTICS -DF_MALLOC -DEXTRA_DEBUG
-DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_SCHED_YIELD -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H -DHAVE_TIMEGM
-DUSE_SYSV_SEM -DHAVE_EPOLL -DHAVE_SIGIO_RT -DHAVE_SELECT -c action.c -o action.o
If I turn on -Wall by manually adding it to the Makefile.defs here:
ifeq ($(mode),debug)
DEFS+= -DEXTRA_DEBUG
endif
Changed to:
ifeq ($(mode),debug)
DEFS+= -DEXTRA_DEBUG -Wall
endif
Then I get this line:
gcc -DNAME='"openser"' -DVERSION='"1.1.0-notls"' -DARCH='"i686"' -DOS='"linux"'
-DCOMPILER='"gcc 4.1.0"' -D__CPU_i686 -D__OS_linux -D__SMP_no -DCFG_DIR='"/usr/local/etc/openser/"' -DPKG_MALLOC
-DSHM_MEM -DSHM_MMAP -DUSE_IPV6 -DUSE_MCAST -DUSE_TCP -DDISABLE_NAGLE -DHAVE_RESOLV_RES -DSTATISTICS -DF_MALLOC -DEXTRA_DEBUG -Wall
-DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_SCHED_YIELD -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H -DHAVE_TIMEGM
-DUSE_SYSV_SEM -DHAVE_EPOLL -DHAVE_SIGIO_RT -DHAVE_SELECT -c action.c -o action.o
But, that doesn't complain about all possible warnings. This does
(-W -Wall):
gcc -DNAME='"openser"' -DVERSION='"1.1.0-notls"' -DARCH='"i686"' -DOS='"linux"'
-DCOMPILER='"gcc 4.1.0"' -D__CPU_i686 -D__OS_linux -D__SMP_no -DCFG_DIR='"/usr/local/etc/openser/"' -DPKG_MALLOC
-DSHM_MEM -DSHM_MMAP -DUSE_IPV6 -DUSE_MCAST -DUSE_TCP -DDISABLE_NAGLE -DHAVE_RESOLV_RES -DSTATISTICS -DF_MALLOC -DEXTRA_DEBUG -W -Wall
-DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_SCHED_YIELD -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H -DHAVE_TIMEGM
-DUSE_SYSV_SEM -DHAVE_EPOLL -DHAVE_SIGIO_RT -DHAVE_SELECT -c action.c -o action.o
In file included from mem/mem.h:54,
from lock_alloc.h:50,
from locking.h:66,
from statistics.h:102,
from sr_module.h:42,
from action.c:55:
mem/f_malloc.h: In function âfm_get_fragsâ:
mem/f_malloc.h:162: warning: comparison between signed and unsigned
This should be size_t:
flags.h:#define MAX_FLAG ((unsigned int)( sizeof(flag_t) * CHAR_BIT - 1 ))
And these:
mem/vq_malloc.c: unsigned int real_size;
mem/vq_malloc.c:struct vqm_block* vqm_malloc_init(char* address, unsigned int
size)
mem/vq_malloc.c:void* vqm_malloc(struct vqm_block* qm, unsigned int size,
mem/vq_malloc.c: char* file, char* func, unsigned int line)
mem/vq_malloc.c:void* vqm_malloc(struct vqm_block* qm, unsigned int size)
mem/vq_malloc.h:struct vqm_block* vqm_malloc_init(char* address, unsigned int
size);
mem/vq_malloc.h:void* vqm_malloc(struct vqm_block*, unsigned int size, char*
file, char* func,
mem/vq_malloc.h: unsigned int line);
mem/vq_malloc.h:void* vqm_malloc(struct vqm_block*, unsigned int size);
mem/shm_mem.c:inline static void* sh_realloc(void* p, unsigned int size)
mem/shm_mem.c:void* _shm_resize( void* p, unsigned int s, const char* file,
const char* func,
mem/shm_mem.c:void* _shm_resize( void* p , unsigned int s)
mem/shm_mem.h:inline static void* _shm_malloc(unsigned int size,
mem/shm_mem.h:inline static void* _shm_realloc(void *ptr, unsigned int size,
mem/shm_mem.h:void* _shm_resize(void* ptr, unsigned int size, const char* f,
const char* fn,
mem/shm_mem.h:inline static void* shm_malloc(unsigned int size)
mem/shm_mem.h:inline static void* shm_realloc(void *ptr, unsigned int size)
mem/shm_mem.h:void* _shm_resize(void* ptr, unsigned int size);
And what's up with this?:
modules/sl/sl.c: return sl_send_reply( msg, (unsigned int)(unsigned
long)str, str2);
Turns out, that is a cast from a char* (which, on 64-bit systems is 64-bits or
unsigned long) to a 32-bit value:
static int w_sl_send_reply(struct sip_msg* msg, char* str, char* str2)
{
return sl_send_reply( msg, (unsigned int)(unsigned long)str, str2);
}
If you are on a 64-bit system and that char* points to a location > 4GB into memory, then sl_send_reply is in trouble, because it is no longer pointing to the same location in memory when inside that function. It is now pointing to some random location inside the 4GB envelope.
While OpenSER may be compiled on a 64-bit system (which I run a couple, as well, and it does compile), it is not 64-bit safe. If you were to run this with 32 GB of memory in the machine and use up 8 GB of memory, then start OpenSER, it would die spectacularly.
I'm not trying to pick a fight or anything -- I just want to make sure these obvious errors are caught and resolved. Anything that references a length or index to an array, a memory size, or any casts from a pointer to some form of integer need to use size_t so that their number of bits change with the platform you are compiling the program for.
Eliot Gable
Operations Engineer
CCNA, CWNA, CWSP, Network+, Security+
Broadvox, LLC
1228 Euclid Avenue
Suite 390
Cleveland, OH 44115-1800
216-373-4808
-----Original Message-----
From: Bogdan-Andrei Iancu [mailto:[EMAIL PROTECTED]
Sent: Friday, December 22, 2006 7:45 AM
To: Eliot Gable
Cc: devel@openser.org
Subject: Re: [Devel] 64-bit compatability
Hi Eliot,
the code it checked to get compiled on 64 arch. Actually I'm using a 64
machine for development.
If you get warning, could you specify the openser version and the list
of warnings?
and, the code is compiled with -Wall... can you post your compiling line ?
Regards,
bogdan
Eliot Gable wrote:
Throughout a lot of the code, I have found many instances where memory
locations are being cast to unsigned int or unsigned long (and even
sometimes just int) instead of size_t. This can cause a problem on
64-bit systems due to memory addresses being 64-bit as opposed to 32-bit
like unsigned int or int. If you use size_t, it correctly uses 64-bit on
64-bit systems and 32-bit on 32-bit systems. But that means that in
str.h, the len parameter must be size_t instead of int to prevent
warnings about signedness.
Also, is there any reason the code is not being compiled globally with
-Wall? It catches a lot of these issues for you.
Eliot Gable
Operations Engineer
CCNA, CWNA, CWSP, Network+, Security+
Broadvox, LLC
1228 Euclid Avenue
Suite 390
Cleveland, OH 44115-1800
216-373-4808
_______________________________________________
Devel mailing list
Devel@openser.org
http://openser.org/cgi-bin/mailman/listinfo/devel