From owner-freebsd-hackers Thu Apr 26 5:24: 1 2001 Delivered-To: freebsd-hackers@freebsd.org Received: from flood.ping.uio.no (flood.ping.uio.no [129.240.78.31]) by hub.freebsd.org (Postfix) with ESMTP id 434EE37B422; Thu, 26 Apr 2001 05:23:50 -0700 (PDT) (envelope-from des@ofug.org) Received: (from des@localhost) by flood.ping.uio.no (8.9.3/8.9.3) id OAA55972; Thu, 26 Apr 2001 14:23:51 +0200 (CEST) (envelope-from des@ofug.org) X-URL: http://www.ofug.org/~des/ X-Disclaimer: The views expressed in this message do not necessarily coincide with those of any organisation or company with which I am or have been affiliated. To: hackers@freebsd.org Subject: gcc -O bug From: Dag-Erling Smorgrav Date: 26 Apr 2001 14:23:49 +0200 Message-ID: Lines: 126 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.4 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG --=-=-= I ran into this bug while analyzing a customer's logs to determine the best time of day for an upgrade. The original script was in Perl, but I rewrote it in C because it was too slow. The C version produces incorrect results when compiled with -O. Note that the log starts at 16:27. The warning about "time" being possibly uninitialized is safe to ignore; this can only happen if the log is empty. The C source and a truncated log that reproduces the bug are attached at the end of this message. des@aes ~/ts/projects/MGW/misc% uname -a FreeBSD aes.thinksec.com 5.0-CURRENT FreeBSD 5.0-CURRENT #23: Fri Apr 13 00:35:50 CEST 2001 des@aes.thinksec.com:/usr/src/sys/compile/AES i386 des@aes ~/ts/projects/MGW/misc% gcc --version 2.95.3 des@aes ~/ts/projects/MGW/misc% cc -Wall -pedantic logalyze.c logalyze.c: In function `main': logalyze.c:28: warning: unused variable `j' des@aes ~/ts/projects/MGW/misc% head -10000 ../ldalog | ./a.out 9412 messages accepted, 588 rejected log spans 6.98 hours average throughput: 1347.73 msg/h Breakdown per hour: 00 | 0 01 | 0 02 | 0 03 | 0 04 | 0 05 | 0 06 | 0 07 | 0 08 | 0 09 | 0 10 | 0 11 | 0 12 | 0 13 | 0 14 | 0 15 | 0 16 |#################### 1009 17 |############################################### 2329 18 |########################## 1274 19 |############## 712 20 |################ 816 21 |################################################## 2446 22 |########## 500 23 |###### 326 des@aes ~/ts/projects/MGW/misc% cc -O -Wall -pedantic logalyze.c logalyze.c: In function `main': logalyze.c:28: warning: unused variable `j' logalyze.c:27: warning: `time' might be used uninitialized in this function des@aes ~/ts/projects/MGW/misc% head -10000 ../ldalog | ./a.out 9412 messages accepted, 588 rejected log spans 7.98 hours average throughput: 1178.92 msg/h Breakdown per hour: 00 | 0 01 | 0 02 | 0 03 | 0 04 | 0 05 | 0 06 | 0 07 | 0 08 | 0 09 | 0 10 | 0 11 | 0 12 | 0 13 | 0 14 | 0 15 | 1 16 |#################### 1008 17 |############################################### 2329 18 |########################## 1274 19 |############## 712 20 |################ 816 21 |################################################## 2446 22 |########## 500 23 |###### 326 des@aes ~/ts/projects/MGW/misc% head -10000 ../ldalog | ./logalyze.pl 9412 messages accepted, 588 rejected log spans 6.98 hours average throughput: 1347.73 msg/h Breakdown per hour: 00 | 0 01 | 0 02 | 0 03 | 0 04 | 0 05 | 0 06 | 0 07 | 0 08 | 0 09 | 0 10 | 0 11 | 0 12 | 0 13 | 0 14 | 0 15 | 0 16 |#################### 1009 17 |############################################### 2329 18 |########################## 1274 19 |############## 712 20 |################ 816 21 |################################################## 2446 22 |########## 500 23 |###### 326 DES -- Dag-Erling Smorgrav - des@ofug.org --=-=-= Content-Disposition: attachment; filename=logalyze.c Content-Description: C source code /* * Copyright (c) 2001 ThinkSec AS. All rights reserved. * * $ThinkSec$ */ #include #include #include #include static int accepted, rejected; static time_t first, last; static double duration; static int hour[24]; static int week[7][25]; static const char hashes[] = "##################################################!"; int main(void) { char *line; size_t len; struct tm tm; time_t time; int i, j, max; double scale; setbuf(stdout, NULL); while ((line = fgetln(stdin, &len)) != NULL) { if (len < 20 || line[4] != '-' || line[7] != '-' || line[10] != '-' || line[13] != ':' || line[16] != ':' || line[19] != ':') { warn("malformed line: %.*s\n", (int)len, line); continue; } if (line[20] == '-') { ++rejected; continue; } tm.tm_year = atoi(line) - 1900; tm.tm_mon = atoi(line + 5) - 1; tm.tm_mday = atoi(line + 8); tm.tm_hour = atoi(line + 11); tm.tm_min = atoi(line + 14); tm.tm_sec = atoi(line + 17); time = mktime(&tm); if (!first) first = time; ++hour[tm.tm_hour]; ++week[tm.tm_wday][tm.tm_hour]; ++week[tm.tm_wday][24]; if (++accepted % 1000 == 0) printf("\r%d", accepted); } last = time; printf("\r%d messages accepted, %d rejected\n", accepted, rejected); duration = (last - first + 1) / 3600.0; printf("log spans %.2f hours\n", duration); printf("average throughput: %.2f msg/h\n", accepted / duration); printf("\nBreakdown per hour:\n\n"); for (i = max = 0; i < 24; ++i) if (hour[i] > max) max = hour[i]; scale = max / 50.0; for (i = 0; i < 24; ++i) { printf("%02d |%.*s %d\n", i, (int)(hour[i] / scale), hashes, hour[i]); } exit(0); } --=-=-= Content-Disposition: attachment; filename=foolog Content-Description: log excerpt 2001-01-05-16:27:23:N 2001-01-05-16:27:24:N 2001-01-05-16:27:25:N 2001-01-05-16:27:25:N 2001-01-05-16:27:25:N 2001-01-05-16:27:26:N 2001-01-05-16:27:26:N 2001-01-05-16:27:26:N 2001-01-05-16:27:27:N 2001-01-05-16:27:28:N 2001-01-05-16:27:28:N 2001-01-05-16:27:29:N 2001-01-05-16:27:29:N 2001-01-05-16:27:29:N 2001-01-05-16:27:31:N 2001-01-05-16:27:32:N 2001-01-05-16:27:32:N 2001-01-05-16:27:32:N 2001-01-05-16:27:33:N 2001-01-05-16:27:33:N 2001-01-05-16:27:34:N 2001-01-05-16:27:34:N 2001-01-05-16:27:34:N 2001-01-05-16:27:35:N 2001-01-05-16:27:35:N 2001-01-05-16:27:35:N 2001-01-05-16:27:36:N 2001-01-05-16:27:37:N 2001-01-05-16:27:38:N 2001-01-05-16:27:39:N 2001-01-05-16:27:39:N 2001-01-05-16:27:39:N 2001-01-05-16:27:40:N 2001-01-05-16:27:41:-N 2001-01-05-16:27:41:N 2001-01-05-16:27:41:N 2001-01-05-16:27:41:-N 2001-01-05-16:27:42:-N 2001-01-05-16:27:43:N 2001-01-05-16:27:43:-N 2001-01-05-16:27:43:N 2001-01-05-16:27:44:-N 2001-01-05-16:27:44:-N 2001-01-05-16:27:45:N 2001-01-05-16:27:45:N 2001-01-05-16:27:47:N 2001-01-05-16:27:47:N 2001-01-05-16:27:48:N 2001-01-05-16:27:48:N 2001-01-05-16:27:49:N 2001-01-05-16:27:49:N 2001-01-05-16:27:50:N 2001-01-05-16:27:50:N 2001-01-05-16:27:50:N 2001-01-05-16:27:51:N 2001-01-05-16:27:52:-N 2001-01-05-16:27:52:N 2001-01-05-16:27:52:N 2001-01-05-16:27:52:N 2001-01-05-16:27:53:N 2001-01-05-16:27:53:N 2001-01-05-16:27:53:N 2001-01-05-16:27:54:-N 2001-01-05-16:27:55:N 2001-01-05-16:27:55:N 2001-01-05-16:27:55:-N 2001-01-05-16:27:56:N 2001-01-05-16:27:57:N 2001-01-05-16:27:58:-N 2001-01-05-16:27:58:N 2001-01-05-16:27:58:N 2001-01-05-16:27:59:N 2001-01-05-16:27:59:N 2001-01-05-16:27:59:N 2001-01-05-16:28:00:N 2001-01-05-16:28:00:N 2001-01-05-16:28:00:N 2001-01-05-16:28:01:N 2001-01-05-16:28:02:N 2001-01-05-16:28:02:N 2001-01-05-16:28:02:N 2001-01-05-16:28:03:N 2001-01-05-16:28:03:N 2001-01-05-16:28:04:N 2001-01-05-16:28:04:N 2001-01-05-16:28:04:N 2001-01-05-16:28:05:N 2001-01-05-16:28:05:N 2001-01-05-16:28:05:N 2001-01-05-16:28:06:-N 2001-01-05-16:28:06:N 2001-01-05-16:28:06:N 2001-01-05-16:28:07:-N 2001-01-05-16:28:07:N 2001-01-05-16:28:08:N 2001-01-05-16:28:08:N 2001-01-05-16:28:09:N 2001-01-05-16:28:09:N 2001-01-05-16:28:09:N 2001-01-05-16:28:10:N --=-=-=-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message