Date: Mon, 30 Nov 1998 23:10:50 -0800 (PST) From: waterman@acm.org To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: bin/8913: negative time values for csh 'time' built-in Message-ID: <199812010710.XAA11274@home>
next in thread | raw e-mail | index | archive | help
>Number: 8913
>Category: bin
>Synopsis: negative time values for csh 'time' built-in
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon Nov 30 23:10:00 PST 1998
>Last-Modified:
>Originator: TS Waterman
>Organization:
PricewaterhouseCoopers
>Release: FreeBSD 2.2.7-STABLE i386
>Environment:
running /bin/csh
>Description:
Long process reports negative time using csh builtin 'time' cmd.
for example:
37809.2u 178.2s 11:08:56.05 -12.-3% 184+294k 54+425io 2009pf+0w
^^^^^^^
>How-To-Repeat:
Run a process over 10 hours or so, in csh, using 'time'
>Fix:
It looks like an int overflow on a time value in the percent
calculation.
in /usr/src/bin/csh/time.c:
case 'P': /* percent time spent running */
/* check if it did not run at all */
- i = (ms == 0) ? 0 : (t * 1000 / ms);
- /* nn.n% */
- (void) fprintf(cshout, "%ld.%01ld%%", i / 10, i % 10);
break;
declarations:
time_t t; /* time_t ==> _BSD_TIME_T_ ==> long, really */
long i;
int ms;
where 'i' is a long, but 'ms' is an int.
In the line i = (ms == 0) ? 0 : (t * 1000 / ms);
In my example: t = 37809 seconds * 1000 //converted to milliseconds
The extra factor of 1000 added in the percent calculation
(t*1000 == 3.78e10) is enough to overflow an int,
but not a long. 't' is a long, so this calc should be computed
as a long, right?
What's broken here?
The easy solution is to convert to float calculations (this isn't at all
time critical). notice the change to a factor of 100:
+ float ft = (ms == 0) ? 0 : ((float)t * 100 / (float)ms);
+ /* nn.n% */
+ (void) fprintf(cshout, "%4.1f%%", ft);
The bigger question is why the first implementation doesn't work,
but it's not a life threatening matter.
perhaps just casting the original calculation to long internally would
also work:
i = (ms == 0) ? 0 : ((long)t * 1000 / (long)ms);
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199812010710.XAA11274>
