Closed Bug 298259 Opened 20 years ago Closed 20 years ago

cast from 'void*' to 'PRUint32' loses precision while compiling with gcc4 on amd64/x86_64

Categories

(Core :: Networking: HTTP, defect)

x86
Linux
defect
Not set
normal

Tracking

()

RESOLVED DUPLICATE of bug 269823

People

(Reporter: bugzilla, Assigned: darin.moz)

Details

User-Agent:       Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8b2) Gecko/20050620 Firefox/1.0+
Build Identifier: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8b2) Gecko/20050620 Firefox/1.0+

This occurs in netwerk/protocol/http/src/nsHttpConnectionMgr.cpp and     widget/src/gtk2/nsDragService.cpp.

Reproducible: Always

Steps to Reproduce:
1. checkout HEAD
2. compile with gcc (GCC) 4.0.0 20050519 (Red Hat 4.0.0-8)
3. kaboom

Actual Results:  
c++ -o nsHttpConnectionMgr.o -c  -DMOZILLA_INTERNAL_API -DOSTYPE=\"Linux2.6.11\" -DOSARCH=\"Linux\" -DBUILD_ID=0000000000 -DIMPL_NS_NET -I/usr/src/cvs/mozilla/fox/mozilla/netwerk/protocol/http/src/../../../base/src -I/usr/src/cvs/mozilla/fox/mozilla/xpcom/ds -I../../../../dist/include/xpcom -I../../../../dist/include/string -I../../../../dist/include/pref -I../../../../dist/include/nkcache -I../../../../dist/include/mimetype -I../../../../dist/include/intl -I../../../../dist/include/unicharutil -I../../../../dist/include/caps -I../../../../dist/include/xpconnect -I../../../../dist/include/js -I../../../../dist/include/uconv -I../../../../dist/include/necko -I../../../../dist/include -I../../../../dist/include/nspr    -I../../../../dist/sdk/include -I/usr/X11R6/include   -fPIC  -I/usr/X11R6/include -fno-rtti -fno-exceptions -Wall -Wconversion -Wpointer-arith -Wcast-align -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wno-long-long -pedantic -fshort-wchar -pthread -pipe  -DNDEBUG -DTRIMMED -O  -I/usr/X11R6/include -DMOZILLA_CLIENT -include ../../../../mozilla-config.h -Wp,-MD,.deps/nsHttpConnectionMgr.pp /usr/src/cvs/mozilla/fox/mozilla/netwerk/protocol/http/src/nsHttpConnectionMgr.cpp
/usr/src/cvs/mozilla/fox/mozilla/netwerk/protocol/http/src/nsHttpConnectionMgr.cpp: In member function 'void nsHttpConnectionMgr::OnMsgUpdateParam(PRInt32, void*)':
/usr/src/cvs/mozilla/fox/mozilla/netwerk/protocol/http/src/nsHttpConnectionMgr.cpp:894: error: cast from 'void*' to 'PRUint32' loses precision
/usr/src/cvs/mozilla/fox/mozilla/netwerk/protocol/http/src/nsHttpConnectionMgr.cpp:895: error: cast from 'void*' to 'PRUint32' loses precision
gmake[6]: *** [nsHttpConnectionMgr.o] Error 1



I was able to force the compile by upcasting the void* to (unsigned long) before it was downcast to PRUint32, but I bet that is the worst possible thing I could have done.

Here is the actual patch, if anyone cares:
--- netwerk/protocol/http/src/nsHttpConnectionMgr.cpp    15 Jan 2005 07:01:20 -0000    1.10
+++ netwerk/protocol/http/src/nsHttpConnectionMgr.cpp    20 Jun 2005 16:48:12 -0000
@@ -891,8 +891,9 @@
 void
 nsHttpConnectionMgr::OnMsgUpdateParam(PRInt32, void *param)
 {
-    PRUint16 name  = (PRUint32(param) & 0xFFFF0000) >> 16;
-    PRUint16 value =  PRUint32(param) & 0x0000FFFF;
+    unsigned long bob = (unsigned long)param;
+    PRUint16 name  = (PRUint32(bob) & 0xFFFF0000) >> 16;
+    PRUint16 value =  PRUint32(bob) & 0x0000FFFF;
 
     switch (name) {
     case MAX_CONNECTIONS:

As per the instructions, here is my buildconfig:
x86_64-unknown-linux-gnu

Build tools
Compiler     Version     Compiler flags
gcc     gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)     -Wall -W -Wno-unused -Wpointer-arith -Wcast-align -Wno-long-long -pedantic -pthread -pipe
c++     gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)     -fno-rtti -fno-exceptions -Wall -Wconversion -Wpointer-arith -Wcast-align -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wno-long-long -pedantic -fshort-wchar -pthread -pipe -I/usr/X11R6/include

Configure arguments
--enable-application=browser --with-default-mozilla-five-home=/opt/firefox --with-system-jpeg --with-system-zlib --with-system-png --enable-official-branding --enable-default-toolkit=gtk2 --enable-application=browser --enable-xft --disable-freetype2 --enable-pango --enable-xinerama --with-java-include-path=/usr/j2se --with-java-bin-path=/usr/j2se/bin --disable-installer --disable-tests --disable-static --disable-debug
It turns out that the |void*| parameter in this case is intentionally being used
to convey a 32-bit unsigned integer.  Better casting is therefore the correct
solution.

*** This bug has been marked as a duplicate of 269823 ***
Status: UNCONFIRMED → RESOLVED
Closed: 20 years ago
Resolution: --- → DUPLICATE
You need to log in before you can comment on or make changes to this bug.