Closed Bug 265369 Opened 20 years ago Closed 20 years ago

compiler warning in unix_rand

Categories

(NSS :: Libraries, defect, P4)

3.9.2
Sun
Solaris
defect

Tracking

(Not tracked)

RESOLVED FIXED
3.10.2

People

(Reporter: julien.pierre, Assigned: julien.pierre)

Details

Attachments

(1 file, 1 obsolete file)

"unix_rand.c", line 831: warning: assignment type mismatch: pointer to const pointer to const char "=" pointer to pointer to char The fix is to declare environ of the same type as cp .
Attached patch fix environ type (obsolete) — Splinter Review
Status: NEW → ASSIGNED
Attachment #162793 - Flags: review?(saul.edwards.bugs)
Assignee: wchang0222 → julien.pierre.bugs
Status: ASSIGNED → NEW
Priority: -- → P4
Comment on attachment 162793 [details] [diff] [review] fix environ type Looks OK. I know it matches the Solaris type, but should we test on other Unices?
Attachment #162793 - Flags: review?(saul.edwards.bugs) → review+
Julien, environ should be declared as extern char **. See http://www.opengroup.org/onlinepubs/009695399/functions/environ.html. I've known about this compiler warning for a long time, and never understood it. Brendan, do you know why the compiler warns about the assignment below? const char * const *cp; extern char **environ; cp = environ; The warning is assignment type mismatch: pointer to const pointer to const char "=" pointer to pointer to char
Saul, Wan-Teh, I don't believe there is any real problem with declaring environ the way I did. At the C ABI level, const isn't differentiated on any platform that I know of, so it shouldn't be an issue either at compile time or runtime. The main issue is that we want the type on both sides of the assignment to match. If we don't want to change the environ declaration (and it seems reasonable to keep it that way, given Wan-Teh's response), then perhaps we should change the cp declaration. However, I agree the compiler warning is puzzling. One should be able to assign a non-const variable to a const variable, just not the other way around, but we are doing the former. Perhaps the compiler is being overzealous. I think the problem is with pointers - it strictly differentiates two pointers by the type to which they point. Is any other compiler complaining about this besides Sun forte ? I'll look into this more in the afternoon.
OS: SunOS → Solaris
Julien, The reason I don't want to declare environ as const char * const * is that I am worried some platforms may declare environ as char ** in a system header file, which would result in conflicting declarations. This compiler warning is very common, not limited to the Solaris compiler. There are similar warnings in lib/certdb/genname.c. This is one of the few cases where I think the right fix is a type cast: cp = (const char * const *)environ;
Target Milestone: --- → 3.10
I have no idea why, but this patch causes a coredump on 64-bit sparccSolaris, as if the environment was corrupt. Reverting the patch on my tree fixed the problem. Just when I thought this couldn't get weirder, it does. (/usr/dist/pkgs/forte_dev,v6.2/SUNWspro/bin/../WS6U2/bin/sparcv9/dbx) where current thread: t@1 [1] strlen(0x0, 0x7fffff5096100000, 0x0, 0x7efefeff, 0x81010100, 0x0), at 0x7fffffff7e23d2cc =>[2] RNG_SystemInfoForRNG(), line 833 in "unix_rand.c" [3] nsc_CommonInitialize(pReserved = 0xffffffff7fffdcc8, isFIPS = 0), line 2781 in "pkcs11.c" [4] NSC_Initialize(pReserved = 0xffffffff7fffdcc8), line 2835 in "pkcs11.c" [5] secmod_ModuleInit(mod = 0x100059ec0), line 108 in "pk11load.c" [6] SECMOD_LoadPKCS11Module(mod = 0x100059ec0), line 263 in "pk11load.c" [7] SECMOD_LoadModule(modulespec = 0x10005fb70 " name="NSS Internal PKCS #11 Module" parameters="configdir='/home/jp96085/.netscape' certPrefix='' keyPrefix='' secmod='secmod.db' flags=readOnly,optimizeSpace " NSS="trustOrder=0 cipherOrder=100 slotParams={0x00000001=[slotFlags=RSA,RC4,RC2,DES,DH,SHA1,MD5,MD2,SSL,TLS,AES,RANDOM ] } Flags=internal,critical"", parent = 0x100059a30, recurse = 1), line 322 in "pk11pars.c" [8] SECMOD_LoadModule(modulespec = 0x100058b00 "name="NSS Internal Module" parameters="configdir='/home/jp96085/.netscape' certPrefix='' keyPrefix='' secmod='secmod.db' flags=readOnly,optimizeSpace " NSS="flags=internal,moduleDB,moduleDBOnly,critical"", parent = (nil), recurse = 1), line 337 in "pk11pars.c" [9] nss_Init(configdir = 0x10004bdd8 "/home/jp96085/.netscape", certPrefix = 0x7fffffff7f60b060 "", keyPrefix = 0x7fffffff7f60b068 "", secmodName = 0x7fffffff7f60b070 "secmod.db", readOnly = 1, noCertDB = 0, noModDB = 0, forceOpen = 0, noRootInit = 0, optimizeSpace = 1), line 456 in "nssinit.c" [10] NSS_Init(configdir = 0x10004bdd8 "/home/jp96085/.netscape"), line 493 in "nssinit.c" [11] main(argc = 4, argv = 0xffffffff7fffec78), line 214 in "shlibsign.c" (/usr/dist/pkgs/forte_dev,v6.2/SUNWspro/bin/../WS6U2/bin/sparcv9/dbx) p cp cp = 0x7fffffff7e066518 (/usr/dist/pkgs/forte_dev,v6.2/SUNWspro/bin/../WS6U2/bin/sparcv9/dbx) p *cp *cp = 0x7fffff5096100000 "" (/usr/dist/pkgs/forte_dev,v6.2/SUNWspro/bin/../WS6U2/bin/sparcv9/dbx)
Comment on attachment 162793 [details] [diff] [review] fix environ type Julien, were you referring to this patch in comment 6?
Wan-Teh, Yes, I was referring to the patch https://bugzilla.mozilla.org/attachment.cgi?id=162793 . The problem turned out to be a silly mistake - environ was redeclared as a local in the patch, rather than extern, so it had an uninitialized value.
Attachment #162793 - Attachment is obsolete: true
Attachment #182834 - Flags: review?(wtchang)
Attachment #162793 - Flags: review+
Target Milestone: 3.10 → 3.10.1
Comment on attachment 182834 [details] [diff] [review] just cast it, which will ensure no compiler warnings Julien, Nelson should review this patch because it was him who added those 'const' keywords (in rev. 1.2 of unix_rand.c). Note that lib/certdb/genname.c has similar compiler warnings and should be fixed at the same time. If Nelson doesn't like casting, here is one way to help the compiler out: we add only one 'const' at a time. This requires an extra local variable. Index: unix_rand.c =================================================================== RCS file: /cvsroot/mozilla/security/nss/lib/freebl/unix_rand.c,v retrieving revision 1.16 diff -u -r1.16 unix_rand.c --- unix_rand.c 8 Dec 2004 23:00:19 -0000 1.16 +++ unix_rand.c 9 May 2005 21:28:19 -0000 @@ -833,12 +833,18 @@ * is running on. */ if (environ != NULL) { - cp = environ; - while (*cp) { - RNG_RandomUpdate(*cp, strlen(*cp)); - cp++; + /* + * Compilers can't go from char ** to const char * const * or + * even const char ** directly, so we need to do it in two steps. + */ + char * const *evp; + const char *ev; + evp = environ; + while ((ev = *evp) != NULL) { + RNG_RandomUpdate(ev, strlen(ev)); + evp++; } - RNG_RandomUpdate(environ, (char*)cp - (char*)environ); + RNG_RandomUpdate(environ, (char*)evp - (char*)environ); } /* Give in system information */
Attachment #182834 - Flags: review?(wtchang) → review?(nelson)
Comment on attachment 182834 [details] [diff] [review] just cast it, which will ensure no compiler warnings r=nelson.bolyard
Comment on attachment 182834 [details] [diff] [review] just cast it, which will ensure no compiler warnings really r=nelson this time.
Attachment #182834 - Flags: review?(nelson) → review+
Nelson, thanks for the review. I have checked this fix in to the tip . Checking in unix_rand.c; /cvsroot/mozilla/security/nss/lib/freebl/unix_rand.c,v <-- unix_rand.c new revision: 1.17; previous revision: 1.16 done
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Target Milestone: 3.10.1 → 3.10.2
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: