Closed
Bug 123403
Opened 23 years ago
Closed 21 years ago
LL_INIT should use PR_UINT32, not PR_INT32
Categories
(NSPR :: NSPR, defect, P1)
Tracking
(Not tracked)
RESOLVED
FIXED
4.6
People
(Reporter: timeless, Assigned: wtc)
References
()
Details
Attachments
(1 file)
701 bytes,
patch
|
wtc
:
review+
|
Details | Diff | Splinter Review |
The destination fields are Unsigned, so we shouldn't cast them to signed in the interim. http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/nsprpub/pr/include/prtypes.h&rev=3.21&mark=342,344#339
Assignee | ||
Comment 1•23 years ago
|
||
This is a simple change, but what is the problem? Does some compiler warn about signed/unsigned mismatch?
Status: NEW → ASSIGNED
Priority: -- → P1
Target Milestone: --- → 4.2
Comment 2•21 years ago
|
||
No compiler does not warn you about anything, but it silently does a sign extension. try : PRInt64 minus_one_a = LL_INIT(0,-1); PRInt64 minus_one_b = LL_INIT(-1,-1); PRInt64 minus_one_hi_and_lo = LL_INIT(0xFFFFFFFF,0xFFFFFFFF); PRInt64 minus_one_only_lo = LL_INIT(0,0xFFFFFFFF); /* test one if initialication is portable as it claims this test should pass on both systems with and without native 64 bit integers */ if ( LL_EQ(minus_one_a, minus_one_hi_and_lo) ) printf "test 1 failed - (0,-1) initializes both hi and lo portions!\n" else printf "test 1 passed\n" /* test two if initialication is portable as it claims this test should pass on both systems with and without native 64 bit integers */ if ( LL_EQ(minus_one_b, minus_one_hi_and_lo) ) printf "test 2 passed\n" else printf "test 2 failed - (-1,-1) initialization is not working as expected!\n"
Blocks: 241696
Attachment #147132 -
Flags: review?(wchang0222)
Assignee | ||
Updated•21 years ago
|
Attachment #147132 -
Flags: review?(wchang0222) → review+
Assignee | ||
Comment 4•21 years ago
|
||
The sign extension problem that Jan Ruzicka pointed out in comment 2 is a different problem because it only affects platforms where HAVE_LONG_LONG is defined. The cause of the problem is that you cannot pass negative integers as arguments to the LL_INIT macro. timeless, is there any currently supported platform where HAVE_LONG_LONG is undefined? I am wondering how we can test your patch. I have already tested it with NSPR but would like to test it with Mozilla, too.
Comment 5•21 years ago
|
||
(In reply to comment #4) > The cause of the problem is that you cannot pass negative > integers as arguments to the LL_INIT macro. How am I supposed to init a PRInt64 with -1, then? I'd rather not do it by substracting 1 from zero... I currently use LL_INIT(0, -1). that will obviously not work when there is no native 64bit int type.
Assignee | ||
Comment 6•21 years ago
|
||
If it is a global or static variable, you should say: PRInt64 minus_one = LL_INIT(0xffffffff, 0xffffffff); If it is a local variable, you should say: PRInt64 minus_one; minus_one = LL_I2L(-1);
Assignee | ||
Comment 7•21 years ago
|
||
Patch checked into the NSPR trunk (NSPR 4.6) and NSPRPUB_PRE_4_2_CLIENT_BRANCH (Mozilla 1.8 alpha). Since all currently supported platforms define HAVE_LONG_LONG, this patch is effectively a no-op. I did try undefining HAVE_LONG_LONG on Linux and Solaris and building NSPR. I didn't see any compiler warnings before the patch was applied. All NSPR tests (in particular lltest.c) passed after the patch was applied.
Severity: normal → trivial
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Target Milestone: 4.2 → 4.6
Assignee | ||
Comment 8•21 years ago
|
||
"no-op" is not the right word. It should say "this patch is effectively modifying dead code".
You need to log in
before you can comment on or make changes to this bug.
Description
•