|
Message-ID: <55641c2f-2745-ad92-c64c-0f8ee9603fbd@pobox.com> Date: Sat, 4 Jul 2020 16:13:51 -0500 From: Daniel Santos <daniel.santos@...ox.com> To: musl@...ts.openwall.com Subject: Re: [PATCH] Fix signed compare warning On 6/26/20 1:26 AM, Jeffrey Walton wrote: > On Fri, Jun 26, 2020 at 2:20 AM Daniel Santos <daniel@...t.us> wrote: >> ... >>>> if (at) { >>>> - if (at->tv_nsec >= 1000000000UL) return EINVAL; >>>> + if ((unsigned long)at->tv_nsec >= 1000000000UL) return EINVAL; >>>> if (__clock_gettime(clk, &to)) return EINVAL; >>>> to.tv_sec = at->tv_sec - to.tv_sec; >>>> if ((to.tv_nsec = at->tv_nsec - to.tv_nsec) < 0) { >>>> >>> may be use < 0 || >= 1000000000L and avoid the cast. >>> there is a similar issue in src/thread/pthread_cond_timedwait.c as well >> Thank you for that. I'll resubmit changing both instances. >> >> In this case, the POSIX spec requires nt_nsec to be a long ( >> https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html >> ). Either way, a good optimizer should convert this into an unsigned > I believe the C language says the signed value gets promoted to an > unsigned value. I don't believe the optimizer has anything to do with > it. > > That's why -1 is greater than 1 in C: > > int x = -1; > unsigned int y = 1; > if (x > y) > printf("WTF???\n"); > > Jeff Yes, I was referring to Khem's suggestion: may be use < 0 || >= 1000000000L and avoid the cast. The optimizer should convert this into a single unsigned compare on just about any modern processor (e.g., two's compliment). I suppose the real solution is to not add -Wextra to CFLAGS unless you add -Wno-sign-compare, as musl intentionally uses this promotion rule. Thanks! Daniel
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.