6048 RLIM_INFINITY (et al) should be unsigned for _LP64
Review Request #71 — Created July 4, 2015 and submitted
Information | |
---|---|
risto3 | |
illumos-gate | |
6048 | |
1d28bbc... | |
Reviewers | |
general | |
6048 RLIM_INFINITY (et al) should be unsigned for _LP64
building gcc with gcc for 64-bits (-m64) identifies an issue in /usr/include/sys/resource.h
with the definition of RLIM_INFINITY.The warnings are:
../../gcc-4.9.3/libiberty/stack-limit.c: In function 'stack_limit_increase': ../../gcc-4.9.3/libiberty/stack-limit.c:53:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] && rlim.rlim_cur != RLIM_INFINITY ../../gcc-4.9.3/libiberty/stack-limit.c:55:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] && (rlim.rlim_max == RLIM_INFINITY || rlim.rlim_cur < rlim.rlim_max)) ../../gcc-4.9.3/libiberty/stack-limit.c:58:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if (rlim.rlim_max != RLIM_INFINITY && rlim.rlim_cur > rlim.rlim_max)Currently the gate defines as follows:
#if defined(_LP64) typedef unsigned long rlim_t; #define RLIM_INFINITY (-3l) #define RLIM_SAVED_MAX (-2l) #define RLIM_SAVED_CUR (-1l) #else /* _LP64 */ /* * The definitions of the following types and constants differ between the * regular and large file compilation environments. */ #if _FILE_OFFSET_BITS == 32 typedef unsigned long rlim_t; #define RLIM_INFINITY 0x7fffffff #define RLIM_SAVED_MAX 0x7ffffffe #define RLIM_SAVED_CUR 0x7ffffffd #else /* _FILE_OFFSET_BITS == 32 */ typedef u_longlong_t rlim_t; #define RLIM_INFINITY ((rlim_t)-3) #define RLIM_SAVED_MAX ((rlim_t)-2) #define RLIM_SAVED_CUR ((rlim_t)-1) #endif /* _FILE_OFFSET_BITS == 32 */ #endif /* _LP64 */Notice the omission of the cast '(rlim_t)' upon '-3l' for 64-bit RLIM_INFINITY.
I took this code piece to verify that the warnings go away if corrected
#include <stdint.h> #include <sys/resource.h> #ifdef OVERRIDE #undef RLIM_INFINITY #define RLIM_INFINITY ((rlim_t)-3) #endif void stack_limit_increase (unsigned long pref) { struct rlimit rlim; if (getrlimit (RLIMIT_STACK, &rlim) == 0 && rlim.rlim_cur != RLIM_INFINITY && rlim.rlim_cur < pref && (rlim.rlim_max == RLIM_INFINITY || rlim.rlim_cur < rlim.rlim_max)) { rlim.rlim_cur = pref; if (rlim.rlim_max != RLIM_INFINITY && rlim.rlim_cur > rlim.rlim_max) rlim.rlim_cur = rlim.rlim_max; setrlimit (RLIMIT_STACK, &rlim); } }which gives the following:
richard@omnis:/home/richard/src/tstack$ /opt/gcc-4.8.1/bin/gcc -m64 -c -o stack-limit.o stack-limit.c -W stack-limit.c: In function ‘stack_limit_increase’: stack-limit.c:14:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] && rlim.rlim_cur != RLIM_INFINITY ^ stack-limit.c:16:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] && (rlim.rlim_max == RLIM_INFINITY || rlim.rlim_cur < rlim.rlim_max)) ^ stack-limit.c:19:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if (rlim.rlim_max != RLIM_INFINITY && rlim.rlim_cur > rlim.rlim_max) ^ richard@omnis:/home/richard/src/tstack$ /opt/gcc-4.8.1/bin/gcc -m64 -c -o stack-limit.o stack-limit.c -W -DOVERRIDE richard@omnis:/home/richard/src/tstack$ /opt/gcc-4.8.1/bin/gcc -m32 -c -o stack-limit.o stack-limit.c -W richard@omnis:/home/richard/src/tstack$ /opt/gcc-4.8.1/bin/gcc -m32 -c -o stack-limit.o stack-limit.c -W -DOVERRIDE richard@omnis:/home/richard/src/tstack$using -save-temps without and with -DOVERRIDE, the generated code is identical.
So the _LP64 definition should be corrected to correspond to the _FILE_OFFSET_BITS == 64 32-bit definition,
Status: Closed (submitted)
Change Summary:
Issue #6048 has been updated by Electric Monk.
Status changed from New to Closed
% Done changed from 0 to 100"git commit d007da4be6a31f5f7c6e3e822eef044a9ac6ae18":https://github.com/illumos/illumos-gate/commit/d007da4be6a31f5f7c6e3e822eef044a9ac6ae18
<pre>commit d007da4be6a31f5f7c6e3e822eef044a9ac6ae18
Author: Richard PALO richard@NetBSD.org
Date: 2015-07-27T14:39:03.000Z6048 RLIM_INFINITY (et al) should be unsigned for _LP64 Reviewed by: Robert Mustacchi <rm@joyent.com> Reviewed by: Andy Stormont <astormont@racktopsystems.com> Reviewed by: Toomas Soome <tsoome@me.com> Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com> Approved by: Dan McDonald <danmcd@omniti.com></pre>