home *** CD-ROM | disk | FTP | other *** search
/ The Hacker's Encyclopedia 1998 / hackers_encyclopedia.iso / etc / misc / hackhorr.txt < prev    next >
Encoding:
Text File  |  2003-06-11  |  47.6 KB  |  920 lines

  1.  
  2. Brad:
  3.         When I was finishing my Master's here at CMU, we were using a
  4. PDP-11/45 that was showing incipient senility.  One week before the final
  5. demo, the RT-11 monitor stopped powering up properly and instead took to
  6. halting the machine at some incredibly non-obvious spot.
  7.         This was not acceptable performance, so we scratched our heads
  8. faster and faster for about two days trying to fix it.  Finally, in 
  9. desperation, we single-stepped the RT-11 boot sequence, and found that it
  10. was doing a memory check that it believed was failing.  It then tried to
  11. jump to a "memory check failed" diagnostic that it expected to find in
  12. memory, which of course was not there.  What was there, however, was a
  13. random collection of bits that just happened to look like a jump to the
  14. original totally bogus location that we could see on the lights of the
  15. front panel.  (Incidentally, we could read and write the supposedly bad
  16. memory location using the front panel).  The solution?  We powered up the
  17. machine with the halt switch asserted.  Then we loaded in a "Return from
  18. Interrupt" instruction where the random bit collection was.  Presto.
  19. By the way, until this problem occurred, we were competing for use of the
  20. 11/45 with two other groups of students.  Since they all gave up when 
  21. this difficulty hit, we had sole use of the machine until it got officially
  22. fixed.
  23.         Bob
  24. ----Message 12 (993 chrs) is----
  25. Mail-From: ARPANET host USC-ISIB received by CMU-10A at 27-Oct-82 20:08:14-EDT
  26. Date: 27 Oct 1982 1708-PDT
  27. From: Dave Dyer       <DDYER at USC-ISIB>
  28. Subject: horrors
  29. To: allen at CMU-10A
  30.  
  31.  
  32.  On a tops-10 system I was responsible for, I made a typo installing
  33. a bug fix to the monitor's file system code.  The result was that for
  34. several days (until the file system began seriously degrading) a randomly
  35. selected physical block of the disk was written with a copy of the
  36. retrieval information for the system's accounting files.
  37.  
  38.  Another, we had installed a new memory box, which unknon to us
  39. was responding with the wrong word once in 10^8 or so operations.
  40. We ran with this flake for about a month before the bit decay was
  41. tracked down to the culprit.  At that point, EVERYTHING that had
  42. been done during the bad time was "possibly" damaged, and quite a few
  43. were in fact damaged.  It took about a year before the last artifacts
  44. of that episode were filtered out.
  45.  
  46. -------
  47. ----Message 13 (857 chrs) is----
  48. Mail-From: ARPANET host MIT-ML received by CMU-10A at 27-Oct-82 20:37:13-EDT
  49. Date: 27 October 1982 20:40-EDT
  50. From: Peter Szolovits <PSZ at MIT-ML>
  51. Subject:  Hacking horror stories
  52. To: Brad.Allen at CMU-10A
  53. cc: PSZ at MIT-ML
  54.  
  55. My first paying programming job was to convert some FORTRAN programs
  56. from the 7094 to an IBM 360 in 1966 at UCLA.  Some of these were
  57. unbelievably hairy (doing memory management within Fortran, character
  58. manipulation before there were characters in Fortran, etc.) and obscure
  59. (some of the code was in fact Fortran II code that first needed
  60. conversion to Fortran IV).  The real horror was that my predecessor had
  61. been taken away by the men in the white coats, and lived in a mental
  62. hospital; so there really was no way to get any additional info on much
  63. of this code, and I had a graphic example of where my job led.
  64. ----Message 14 (2082 chrs) is----
  65. Mail-From: CMUFTP host CMU-CS-VLSI received by CMU-10A at 27-Oct-82 20:44:03-EDT
  66. Date: 27 Oct 1982 20:30-EDT
  67. From: James.Gosling at CMU-CS-VLSI at CMU-10A
  68. Subject: Re: Hacking horror stories
  69. To: Brad.Allen at CMU-10A
  70. Message-Id: <82/10/27 2030.262@CMU-CS-VLSI>
  71.  
  72. Several years ago I was doing some development work on a compiler for a
  73. language like Pascal.  And like most Pascal implementations, the
  74. compiler was written in the same language and was used to compile
  75. itself.  It was broken into many modules.  To make a change to the
  76. compiler I would just recompile the affected module and link it back in
  77. with the rest of the modules.  At some point, I took one of these test
  78. versions of the compiler and replaced the production compiler with it
  79. -- it seemed to be just fine.  In fact, it was fine for quite a while.
  80. So long that this new version got onto the backups and all of the
  81. backups of the production compiler were lost.  There was also the
  82. problem that the old production compiler couldn't have compiled the new
  83. compiler anyway, since the language had changed quite a lot.  Well...
  84. In one of the modules that had never been through the new compiler was
  85. a piece of code that tickled a bug in the code generator.  The bug was
  86. a cooperative one between one of the new pieces of code and one of the
  87. old one.  What I ended up with was a compiler which I couldn't
  88. recompile because fixing the bug involved compiling a module that
  89. tickled the bug.  Because of the circularity in the compiler (that it
  90. compiled itself) I was up the proverbial creek without a paddle.  There
  91. was no way that I could recompile or shuffle anything to fix the beast.
  92. All backups were either of the broken compiler or had been overwritten.
  93. The solution was incredibly messy: I spent a long time doing intensive
  94. octal surgery on the object modules that I had.  This was made very
  95. difficult because there was essentially no information left around to
  96. correlate program text to compiled code and because the bug caused bad
  97. code to be generated in many places.
  98.  
  99.                                 James.
  100. ----Message 15 (1169 chrs) is----
  101. Mail-From: ARPANET host MIT-XX received by CMU-10A at 27-Oct-82 22:29:30-EDT
  102. Date: 27 Oct 1982 2231-EDT
  103. From: Larry Seiler <SEILER at MIT-XX>
  104. Subject: Bug fix horror story
  105. To: Allen at CMU-10A
  106. cc: Seiler at MIT-XX
  107.  
  108. Maybe this is not quite what you have in mind, but in case it is...
  109.  
  110. My most painful bug was a simple uninitialized variable (I had moved
  111. the initialization statement to a position after the first reference).
  112. This variable was a pointer, and its position in the call stack just
  113. happened to contain an address in code space.  So running the program 
  114. caused certain instructions in a different procedure to be changed 
  115. into noops, with bizarre results.  Loading the debugger caused the 
  116. program to work correctly, by tranferring the target of the modification
  117. into an unused part of the debugger (I think).  Even after I discarded my
  118. innocent assumption that the code I wrote was the code that was being
  119. executed, I still had to guess what routine was writing to code space
  120. (and by what mechanism).  Total time required to fix the bug:  8 hours.
  121.  
  122. How embarrassing.  Why am I telling you this?  Well, why not?
  123.  
  124. Larry Seiler
  125. -------
  126. ----Message 17 (1759 chrs) is----
  127. Mail-From: ARPANET host Utah-20 received by CMU-10A at 28-Oct-82 02:11:44-EDT
  128. Date: 28 Oct 1982 0012-MDT
  129. From: JW-Peterson at UTAH-20 (John W. Peterson)
  130. Subject: Re: Hacking horror stories
  131. To: Brad.Allen at CMU-10A
  132. cc: JW-Peterson at UTAH-20
  133. In-Reply-To: Your message of 27-Oct-82 1516-MDT
  134.  
  135. In trying to learn the graphics/animation biz, I've run into a few.  In
  136. making some films this summer I wound up working strictly at night, to
  137. help prevent any light from entering the room.  The filming had to be
  138. completed entirly over the weekend, so it would interfere with normal
  139. bussiness activity (like turning the lights on...).  Worse yet the
  140. old Bolex I was using had no way for the computer to trip it's shutter,
  141. so I had to manually press the cable release every time the computer rang
  142. the terminal bell; for several hours at a strech.
  143.  
  144. Some other animation stories: Before color graphics CRT's & framebuffers
  145. were invented, the poor filmmaker had to sleep next to the camera.  When
  146. the bell rang, he would wake up, change the color filter wheel to the
  147. next primary color, backwind the film all the way, and go back to sleep...
  148.  
  149. Perhaps best of all is Jim Blinn's "Korean Janitor" movie.  During the
  150. creation of the DNA sequences for "Cosmos", they decided to let the
  151. camera run over night, with the computer tripping it every several
  152. seconds.  So the locked up the room and put a big "Filming in process:
  153. Do Not Enter" sign on the door.  Unfortunatly, the Korean janitor could
  154. not read the english sign but DID have a pass key.  The resulting film
  155. shows a DNA molecule twisting in space, a flood of light, and then a
  156. jerkey sequence of the janitor cleaning the room at 200mph, seen as a
  157. reflection in the screen.
  158. jp
  159. -------
  160. ----Message 19 (1595 chrs) is----
  161. Mail-From: ARPANET host MIT-XX received by CMU-10A at 28-Oct-82 10:50:59-EDT
  162. Date: 28 Oct 1982 1054-EDT
  163. From: Geoffrey H. Cooper <GEOF at MIT-XX>
  164. Subject: Re: Hacking horror stories
  165. To: Brad.Allen at CMU-10A
  166. cc: geof at MIT-XX
  167. In-Reply-To: Your message of 27-Oct-82 1716-EDT
  168.  
  169. This is our favorite "what happens when people are taught higher level
  170. models before the lower level ones" story.  I get this second hand,
  171. so some of the details might be a little off.  It may not be of the sort
  172. you had in mind, but it's amusing enough to bear repeating anyway.
  173.  
  174. Around here, we teach a course in software engineering in which the
  175. students are taught and write programs in CLU (a language which lets user
  176. defined abstractions work the same way that the language defined ones do).
  177. One common final project for the course involved writing an assembler in
  178. CLU.  The problem statement required that numbers be input and output in
  179. octal, rather than decimal.
  180.  
  181. Most of the students, I am told, defined an OCTAL abstraction, with all the
  182. normal integer arthmetic operations, and with Parse and Unparse operations
  183. that converted strings into OCTAL's and back again.
  184.  
  185. This was implemented by representing an OCTAL as an array of integers, each
  186. of which represented an octal digit.  The arithmetic operations simulated
  187. octal arithmetic on this representation.  None of the students was
  188. apparently aware that the normal integer data abstraction that they had
  189. been using was really just stored as bits, which were more easily converted
  190. to octal than decimal.
  191.  
  192. -Geof Cooper
  193. -------
  194. ----Message 20 (1069 chrs) is----
  195. Mail-From: ARPANET host CMU-20C received by CMU-10A at 28-Oct-82 10:57:26-EDT
  196. Date: Thursday, 28 October 1982  10:57-EDT
  197. From: Jon Webb <Webb at Cmu-20c>
  198. To:   Brad.Allen at CMU-10A
  199. Cc:   webb at CMU-20C
  200. Subject: Hacking horror stories
  201.  
  202. Well, here it is: I was working as an undergraduate programmer at my
  203. undergraduate university, and I basically had the run of the
  204. time-sharing user interface (it was TSO, on an IBM 360/65).  I decided
  205. it would be nice if you could edit lines you'd typed, like the facility
  206. in the C-shell on unix except more primitive.  Well, it was a pretty
  207. trivial change to allow this, but unfortunately to be effective the
  208. change had to be installed in the system, I couldn't test it in advance.
  209. So I installed it one night, and TSO wouldn't work anymore.  Very
  210. embarassing, especially as the backup method I thought would work
  211. didn't.  In fact one of the systems programmers had to be called in to
  212. fix the system, in the middle of the night.  I gave up on editting in
  213. TSO.  This is an argument for personal computers.
  214.  
  215. Jon
  216. ----Message 21 (910 chrs) is----
  217. Mail-From: ARPANET host UCB-C70 received by CMU-10A at 28-Oct-82 11:57:13-EDT
  218. Date: 28 Oct 1982 08:55:57-PDT
  219. From: CSVAX.bitar@Berkeley
  220. To: Brad.Allen@CMU-10A
  221. Subject: Hacking horror story
  222.  
  223. I was working late one night developing a file under the Unix operating
  224. system.  I was in a hurry at one point, and wanting to rename the file,
  225. I executed the unix move cmd.
  226. A moment later Unix complained of indigestion,
  227. and I noticed that instead of typing 'mv oldname newname', which
  228. is Unix's way of renaming a file, I had typed 'rm oldname newname'.
  229. So Unix had executed 'rm oldname', then run into newname and vomited.
  230. I nearly did the same.
  231.  
  232. Fortunately I did have a backup copy of the file, which I subsequently
  233. re-editted, bringing it up to date.
  234.  
  235. After that incident, though, I was very careful about slight cognitive
  236. mistakes, such as thinking 'move' (mv) and typing 'rm' (remove) instead.
  237. ----Message 22 (1801 chrs) is----
  238. Mail-From: local user C410RF60 at 28-Oct-82 12:06:03-EDT
  239. Date: 28 October 1982 1155-EDT
  240. From: Robert Frederking at CMU-10A
  241. Subject: Re: Hacking horror stories
  242. To: Brad.Allen@CMU-10A
  243.  
  244.         Yourdon's book on software engineering has a few of these.  Most of
  245. my really horrible experiences happened due to politics or manufacturer's
  246. screw-ups.  
  247.         (Example of first): CWRU was building a network, and had to pick between
  248. DEC and Harris computers (Harris one because one of their VPs was a trustee
  249. at CWRU - they were clearly inferior machines).  Besides teaching their staff
  250. how to program, we had to constantly show them that feature X was broken, and
  251. how to fix it.  The project finally collapsed due to their crufty machines.
  252. The operating system was *not* virtual memory (altho user space was), and while
  253. adding networking software to their OS, they ran out of room.  "Sorry".
  254.         (Example of second): in trying to microprogram Intel's hack-of-a-
  255. bit-slice-machine, you had to fit your instructions into a 2-dimensional address
  256. space!  Some instructions could only branch in rows, others only in columns,
  257. yet others only to specific clusters of locations.  It was clearly a hack
  258. to cover running out of instruction bits.  They even had to sell a program
  259. designed to find a fit for your microcode to the available space (I think
  260. the problem is NP-complete - 2d bin packing).
  261.         The best example is the interupt disable instruction on the 6800.
  262. If the least significant bit of the *preceding* instruction is 1, the whole
  263. processor hangs when you try to disable the interupt.  Also, some of the
  264. illegal opcodes (which aren't masked out) will cause the processor to hang
  265. so badly, it can't be reset.  You have to turn it off, and wait for the
  266. dynamic RAM register to fade out!
  267.  
  268.         Bob
  269. ----Message 24 (1536 chrs) is----
  270. Mail-From: CMUFTP host CMU-CS-Speech received by CMU-10A at 28-Oct-82 14:51:46-EDT
  271. Date: 28 Oct 1982 14:47:27-EDT
  272. From: David.Cunnius at CMU-CS-SPEECH at CMU-10A
  273. To: Allen@CMU-10A
  274. Subject: Hacking horrors
  275.  
  276.         The old 15-311, Software Engineering Methods, will probably be one of
  277. the more fertile sources of horror stories. The semester I took this course,
  278. Spring '80, one of the tasks was a database implementation for a science-
  279. fiction wargame. Looking back now, I think our project group was doomed from
  280. the start. Of the original five-man team, one dropped the course before anyone
  281. else even met him, one had to take some time off to deal with a family crisis
  282. around mid-term, and one simply disappeared for a period of three weeks, coming
  283. back without even a memory of where he'd been. Despite all that, we did get
  284. something together for the final demo. We were using a modular design and had
  285. divided the task into thirteen subtasks. At the demo, four of the thirteen
  286. modules worked properly, two that had tested out perfectly the previous day
  287. didn't work at all at the demo, and most of the other seven hadn't even been
  288. coded yet. Of the four modules that worked, the most impressive one was the
  289. display package; unfortunately, that was also the only module which was
  290. optional in the original specification. Two of the members of the group
  291. somehow managed to pull 'D's as our final grade; to this day I haven't had the
  292. nerve to ask the other two what their grades were.
  293.                                         Dave Cunnius (dac@CMU-CS-Speech)
  294. ----Message 25 (2873 chrs) is----
  295. Mail-From: ARPANET host Washington received by CMU-10A at 28-Oct-82 16:18:31-EDT
  296. Date: 28 Oct 1982 1318-PDT
  297. From: Bob Bandes <JUGGLE at WASHINGTON>
  298. Subject: Re: Hacking horror stories
  299. To: Brad.Allen at CMU-10A
  300. In-Reply-To: Your message of 27-Oct-82 1416-PDT
  301.  
  302.  
  303. As a senior project when I was going to school at UC Santa Cruz,
  304. I put together a real-time voice controlled operating system.
  305. The entire thing was written in assembly language on a PDP-11/32
  306. running RT11.  Since this was a single user system with a fixed
  307. disk, it was necessary to make a tape backup at the end of every
  308. session.
  309.  
  310. Well, after one particularly furious day of hacking, I decided to
  311. write my backup tape and go home for the day.  My normal procedure
  312. was to mount my backup tape and use ROLLIN to copy an entire
  313. disk-image to the tape.  Unbeknownst to me, the procedure that
  314. I used had the effect of first initializing the tape before
  315. making the backup.
  316.  
  317. This had always worked just fine.  But on this particular day, I
  318. had been working on my disk I/O routines and apparently had somehow
  319. managed to write garbage on some unknown portion of the disk.
  320. I had no idea that anything was wrong as I went to make my backup
  321. tape.  As usual, first the tape was initialized, then, as ROLLIN
  322. began to write the disk image, the program hung!  There I was
  323. with no backup tape and having major problems making a backup.
  324.  
  325. My next move was to panic.  After settling down somewhat, I tried
  326. rebooting the operating system and making the backup again.
  327. Still the same problem.  Then I remembered about the DECtape
  328. drive on the machine.  If I could only find a DECtape and manage
  329. to individually tranfer the files that I needed I would be home
  330. free.
  331.  
  332. I ran over to the cabinets and began frantically looking for DECtapes.
  333. AHA!  I found one!  As I ran back over to the computer, I took a
  334. bounding step and landed on the side of my ankle.  I proceeded
  335. to lie on the floor writhing and screaming in agony for the next
  336. fifteen minutes.  "This just isn't my day,"  I was saying to myself.
  337. When the pain began to subside I tried to get up.  I couldn't walk
  338. on the ankle since it hurt so much.  So I hopped over to the DECtape
  339. drive and mounted the DECtape.  Then I hopped over to console and
  340. sat down.
  341.  
  342. At least something went right that day, as the machine allowed me
  343. (without hanging) to individually transfer all my files to DECtape.
  344. I then read a clean version of the operating system onto the disk
  345. and proceeded to tranfer all of my files from DECtape back onto
  346. the disk.  This time all went normally with the magtape backup and
  347. the world was safe again for future hacking.
  348.  
  349. Fortunately my ankle wasn't broken.  It was only severly sprained.
  350. For the next few weeks I was forced to do my hacking with an
  351. ace-bandage wrapped around my ankle.
  352.  
  353. --Bob Bandes
  354. -------
  355. ----Message 29 (721 chrs) is----
  356. Mail-From: ARPANET host UCB-C70 received by CMU-10A at 28-Oct-82 23:30:51-EDT
  357. Date: 28 Oct 1982 20:26:51-PDT
  358. From: Kim.norvig@Berkeley
  359. To: brad.allen@cmu-10a
  360. Subject: Re: Hacking horror stories
  361.  
  362. Lucky for me, most of the stories I remember are happy ones, not horror stories.
  363. My favorite story about someone else is when Jim Meehan was writing TALESPIN,
  364. his AI program that generated stories, mostly about birds and bears
  365. running around the forest.  One story started off fine, then started to
  366. slow down, and finally ended with the line
  367.         Joe Bear thinks that FREE STORAGE IS EXHAUSTED
  368. Oh well, @b(I) thought it was cute.
  369.  
  370. Can I be put on the mailing list to see your collection of anecdotes?
  371.  
  372. program to
  373. ----Message 33 (1413 chrs) is----
  374. Mail-From: ARPANET host MIT-MC received by CMU-10A at 30-Oct-82 16:38:45-EDT
  375. Date: 30 Oct 1982 1635-EDT
  376. From: RG.JMTURN at MIT-OZ at MIT-MC
  377. Subject: Re: Hacking horror stories
  378. To: Brad.Allen at CMU-10A
  379. In-Reply-To: Your message of 27-Oct-82 1832-EDT
  380.  
  381. The experience that still makes my skin crawl is the time I was debugging
  382. some Lisp Machine board at the MIT AI lab. I had spent several hours trying
  383. to isolate a noisy signal which seemed to be tied to another one, but I could
  384. not find a common wire and I had replaced all the common chips. In desperation,
  385. I pulled out the the board and yanked the extender, about to give up hope.
  386. As I stared down at the extender, I muttered some curse to the designers
  387. of the machine...and noticed a solder splash on the extender shorting two
  388. lines! For ghu's sake, if you can't trust your tools, what can you trust.
  389.  
  390. On the other hand, for an example of the other extreme, this week, I was
  391. in Montreal doing an installation for Lisp Machine, Inc. A crufty Bus
  392. Interface seemed to be making the machine go 1/2 speed, and sometimes
  393. fail entirely. The person I was working with and I decided to call it a day
  394. around 5, and go to our hotel. When we came back the next morning, the machine
  395. worked perfectly. The best we can figure it, the machine wanted us to be
  396. able to have a night in Montreal, and the afternoon the next day...
  397.  
  398.  
  399.                                         JAmes
  400. -------
  401. ----Message 38 (1003 chrs) is----
  402. Mail-From: ARPANET host UCB-C70 received by CMU-10A at 1-Nov-82 23:02:54-EST
  403. Date: 30 Oct 1982 03:44:28-PDT
  404. From: CSVAX.fishkin@Berkeley
  405. To: Allen@CMU-10A
  406. Subject: painful hacks
  407.  
  408.         Hi there,
  409. My name is Ken Fishkin, and I'm a grad at Berkeley. My most painful hack
  410. occured while hacking a 6K line C database program at the University
  411. of Wisconsin-Madison as an undergrad.  My program worked perfectly, with
  412. all debug prints on.  When I set my 'const' debug to false, however,
  413. the program would crash!  To make things even more fun, if I deleted
  414. 1 debug print the program would still run correctly, but if I deleted
  415. another instead it wouldn't!  I wound up doing a sort of tree traversal,
  416. individually deleting some 200! debug prints individually, finding the
  417. proper sequence of delete-compile-delete that would keep my program
  418. intact. To this day, I still have no idea what was wrong with the
  419. program.
  420.         If possible, could you mail me your final collection of
  421. horrible hacks?
  422.  
  423.                         Ken
  424. ----Message 40 (1981 chrs) is----
  425. Mail-From: ARPANET host CMU-20C received by CMU-10A at 2-Nov-82 11:29:15-EST
  426. Date:  2 Nov 1982 1128-EST
  427. From: MASON at CMU-20C
  428. Subject: horror stories
  429. To: brad.allen at CMU-10A
  430.  
  431. Many roboticists have reported the following demo problem:  when
  432. filming or demonstrating, we often raise venetian blinds, turn on
  433. the lights, or bring in floods.  The increase in ambient light
  434. may cause optical-interrupt type sensors on the robot to stop
  435. functioning, and the heat from floods may affect other components
  436. of the system.  Thus a system which has functioned flawlessly for
  437. months begins to malfunction the very minute the generals arrive.
  438.  
  439. Real-time programming has its special frustrations, but the most
  440. difficult bugs arise from difficulties in the timing of process 
  441. interactions.  Most of these are too complicated to make good stories.
  442. One of the most confusing PDP11 bugs I had may be worth telling.
  443. When a byte is pushed onto the stack, the stack pointer is first 
  444. incremented to keep the pointer at word boundaries.  Hence the
  445. odd byte is garbage, left over from no-longer-active stack frames.
  446. I had a program which pushed a byte, but popped a word, thus accessing
  447. this garbage.  Even careful inspection of the code didn't turn up
  448. this violation of stack discipline.  The worst part is that the 
  449. manifestation of the bug would vary depending on which process last
  450. used the stack.  In particular, the bug became invisible when
  451. single-stepping with our symbolic debugger---the debugger (im)providentially
  452. cleared the relevant byte in the act of saving some registers.
  453.  
  454. This reminds me of another PDP11 bug.  Our 11/40 had a micro-code
  455. error.  The SOB instruction (subract one and branch, used for simple loops)
  456. didn't test the TRAP bit, which is used by debuggers for single-stepping.
  457. Hence, when single-stepping, the programmer was not shown the instruction
  458. following the SOB.  It was executed "in secret", with very confusing results.
  459.  
  460. -------
  461. ----Message 32 (621 chrs) is----
  462. Mail-From: ARPANET host MIT-XX received by CMU-10A at 3-Nov-82 15:20:23-EST
  463. Date: 2 Nov 1982 17:19:35-EST
  464. From: jfw at mit-vax at mit-xx
  465. To: allen@cmu-10a
  466. Subject: Programming horror stories
  467.  
  468. Two summers ago, while I was working on an improvement to our UNIX at LL-ASG,
  469. I fired up a test version a little too fast, and watched with puzzlement as
  470. the filesystem check program started printing out random things.  I wound up
  471. killing a 100Mb filesystem full of useful things.  After 2 weeks of poring over
  472. the code I wrote which did that, I found the bug:  " = " instead of " |= ".
  473. One character did all that...
  474.  
  475. ----Message 37 (1934 chrs) is----
  476. Mail-From: local user C410MS40 at 4-Nov-82 00:37:41-EST
  477. Date:  4 November 1982 0036-EST (Thursday)
  478. From: Mark.Sherman at CMU-10A
  479. To: Brad.Allen at CMU-10A
  480. Subject: Re: Hacking Horror Stories
  481. Message-Id: <04Nov82 003626 MS40@CMU-10A>
  482.  
  483. As an undergrad I worked as a systems staff on a time sharing system
  484. that resembled Multics (called DSL/TSS - think of it as Unix on HP21
  485. series machines).  On such systems, the login program is like any other
  486. program; when a user sits down he "calls" this program from a
  487. predefined file system path to gain access to the system.  For some
  488. unrememberable reason, I had to make some modifications to this
  489. program, did so, and installed the new version.  The only real way to
  490. try this program out was to log out and then log back in.  Having logged
  491. out, I tried to log back in.  To my chagrin, I had accidently set the
  492. protection on the new login program to read instead of its normal
  493. read-execute.  Thus the system refused to run the login program.  By
  494. S.O.P., this would not be a problem - when doing such a drastic change,
  495. we always made sure that at least one other systems programmer was
  496. logged in so that he could patch anything that was necessary, like
  497. changing access control on the login program.  Before my attempt to
  498. change the login program, there were two other systems programmers
  499. logged in.  After my mistake, I walked over to the two other staff
  500. people only to find that they had both logged out - after all each knew
  501. that the other was logged in and so saw no reason to stay on as the
  502. "protection".  Thus there was no way to log into the system and no way
  503. to patch it while it ran.  We had to move the system to a spare disk,
  504. boot a backup system, bring up the extra disk with the file system
  505. containing the bogus protection as a "raw" disk and use a special disk
  506. utility to set the one necessary bit giving execute access to the login
  507. program.
  508.  
  509. Mark
  510. ----Message 38 (3657 chrs) is----
  511. Mail-From: ARPANET host CMU-20C received by CMU-10A at 4-Nov-82 01:40:45-EST
  512. Date: Thursday, 4 November 1982  01:39-EST
  513. From: Skef Wholey <Wholey at CMU-20C>
  514. To:   Brad.Allen at CMU-10A
  515. Subject: Horrorful horrors
  516.  
  517. CMU's 15-311 is indeed a source of horrors, and I experienced a rather horrible
  518. in that class last year.  There were five of us in our group, which we called
  519. "SPAM", each of us competent hackers.  Our project was a 68000 simulator and
  520. debugger, which would run 68000 machine code and let you look at registers and
  521. memory and so forth.  Our work progressed on schedule (with the aid of many
  522. all-nighters), and we were able to run simple assembly language programs just
  523. about a week before the demo.
  524.  
  525. Being a rather noisy bunch, wanting our demo to be as slick as possible, we
  526. decided that we'd run a backgammon program written in C compiled with cc68.  We
  527. had used small programs compiled with cc68 to test the simulator.  The programs
  528. were small enough to compile and assemble on a Vax, print the hex object code,
  529. and type it into file which we would load into our simulator.  The backgammon
  530. program was too large for this, obviously, so the object code was FTP'ed to
  531. another machine, put on tape, and brought to the Computation Center, where we
  532. pulled it off of tape and loaded it into our simulator.  The program didn't
  533. work.  It didn't work the day before the demo.
  534.  
  535. We found a few bugs in our simulator, but worst yet we found bugs in the cc68
  536. compiler, now N machines away.  Fixing these we found bugs in the game playing
  537. program itself.  Compiling the program on the Vax and transporting the object
  538. code was out of the question at this point -- too little time left before the
  539. demo (we had all announced that we'd appear in coat and tie).  So we ever so
  540. carfully patched the hex files, and voila!  The program ran beautifully.
  541.  
  542. That year Comp Center gave each undergrad who needed a computer account an
  543. account on each undergrad machine (TOPS-D and TOPS-E).  These machines were on
  544. Comp Center's DECnet: not a reliable network at that time.  We had the current
  545. version of our system and the patched hex files on TOPS-D, because the load was
  546. lower there that night, but were scheduled to demo on TOPS-E terminals.  DECnet
  547. was, of course, down for quite a while, but finally came up.  We quickly
  548. transferred the current system to the E and ran back to our rooms or homes to
  549. shower and dress.
  550.  
  551. We marched triumphantly into the terminal room and sat at our terminals while
  552. our SPAMmascots fed cookies to the waiting crowd and our professor.  The system
  553. came up fine, and we demonstrated how to deposit into and read from memory and
  554. registers before moving onto the demo programs.  We loaded the hex files, set
  555. breakpoints at our test locations, and lo!  IT DIDN'T WORK.  We were all
  556. somewhat bummed and embarrassed, and managed to muddle through at the mercy of
  557. this mysterious adversary that had destroyed a system that worked an hour
  558. before.  The professor suggested that we get our act a little more together and
  559. have a somewhat less flashy demo in his office a few days hence.
  560.  
  561. The problem: we had neglected to copy the patched hex files from the D to the
  562. E.  We were demoing buggy 68000 code.  The second demo went a bit better.  We
  563. now laugh about the first.  Comp Center no longer gives out accounts to one
  564. student on more than one machine.  Good idea.
  565.  
  566. --Skef
  567.  
  568. [What be your motive for knowin' this stuff, eh?  Doo ye like to feed on
  569.  stories o' suffrin'?  Are ye writin' a book?  I enjoyed reading those sent to
  570.  you so far and enjoyed sending you this one.  Good topic.]
  571.  
  572. ----Message 39 (1236 chrs) is----
  573. Mail-From: CMUFTP host CMU-CS-VLSI received by CMU-10A at 4-Nov-82 09:40:16-EST
  574. Date: 4 Nov 1982 8:36-EST
  575. From: Ed.Frank at CMU-CS-VLSI at CMU-10A
  576. Subject: Hacking horror stories
  577. To: Brad.Allen@cmua
  578. Message-Id: <82/11/04 0836.841@CMU-CS-VLSI>
  579.  
  580. While working on the software for a Graphics terminal we built at
  581. Stanford, I ran into the following problem. The software was written in
  582. assembly language, and was burnt into EPROMS. For a long time the
  583. software easily fit in four 2708 (1K x 8) EPROMS. Well, one week after adding
  584. the graphics support code to the terminal, I simply could not get it to
  585. work. I spent literally dozens of hours going over at most 500 assembly
  586. language statements, to no avail. Things were so bad in fact that I
  587. seriously began to question my abilities as a programmer.  One evening
  588. while I was checking the output of the assembler (for at this point I
  589. was convinced  it was an assembler bug) I noticed that that one of the
  590. target addresses of a jump was greater than FFF (hex). I didn't think
  591. anything of it, until a few seconds latter when it occured to me that
  592. addresses > 4K required 5 proms. I quickly went back to
  593. work, burned the extra eprom, and the program worked perfectly!
  594.         Ed
  595.  
  596. ----Message 40 (731 chrs) is----
  597. Mail-From: local user C410RK40 at 4-Nov-82 09:58:20-EST
  598. Date:  4 November 1982 0955-EST (Thursday)
  599. From: Richard.Korf at CMU-10A (C410RK40)
  600. To: Brad.Allen at CMU-10A
  601. Subject: hacking horror story
  602. Message-Id: <04Nov82 095535 RK40@CMU-10A>
  603.  
  604. Brad,
  605.  My favorite bug of all time concerned an ASR35 Teletype. I was trying to format
  606. some output and found that directly after printing a long line, the second line
  607. was indented by one space. Naturally, the bug went away when I ran the debugger.
  608. It finally turned out that the printing head was physically bouncing off the 
  609. left hand stop. If it didn't have to print again immediately, it would have a
  610. chance to settle back to the beginning of the line.
  611.                -rich
  612. ----Message 41 (1799 chrs) is----
  613. Mail-From: local user C410SS40 at 4-Nov-82 11:42:32-EST
  614. Date:  4 November 1982 1134-EST (Thursday)
  615. From: Steven.Shafer at CMU-10A (C410SS40)
  616. To: brad.allen at CMU-10A
  617. Subject: Horrors!
  618. Message-Id: <04Nov82 113429 SS40@CMU-10A>
  619.  
  620. Brad --
  621.    I had a nasty experience with an old PDP-11/40E running UNIX.
  622.    I had written a program which juggled several processes, one of which was
  623. the largest core-image of any program in existance on the machine (<64K, of
  624. course).  One day, it died a sudden death.
  625.    I started tracking it down with print statements.  At first, the problem
  626. looked like something being set to 0; then, as I added more debugging code,
  627. the 0's jumped around.  I never knew which routines they would crop up in,
  628. or whether global data structures were affected, or even if code itself was
  629. being overwritten.  Sometimes, the program would die even though the
  630. debugging code showed nothing extraordinary.
  631.    I eventually gave up and rewrote the program from scratch, using smaller
  632. processes and succeeding.  Several months later, a paging bug was fixed: it
  633. was responsible for writing 0's on pages when the core-image of a process
  634. was beyond a certain length.
  635.    What makes this a horror story is a UNIX vagary tickled by the bug: within
  636. the code being executed, there was a statement to close a file.  The file,
  637. like all UNIX files, was indexed by a small integer.  When the zeroes struck
  638. this variable, the effect was to close file 0, i.e. disconnect the keyboard!
  639. So, not only did the program die, but it refused to talk to me long before
  640. the actual moment of death, leaving me to watch helplessly as it writhed
  641. in agony, unable to talk to it, unable to interrupt it, and never knowing
  642. where the Flying Fickle Finger of Fate would strike next!
  643.    -- Steve
  644. ----Message 43 (390 chrs) is----
  645. Mail-From: local user C410BL50 at 4-Nov-82 12:30:02-EST
  646. Date:  4 November 1982 1214-EST (Thursday)
  647. From: Bruce.Lucas at CMU-10A (C410BL50)
  648. To: brad.allen at CMU-10A
  649. Subject: horrors
  650. Message-Id: <04Nov82 121457 BL50@CMU-10A>
  651.  
  652. On Unix, I once meant to type "rm *.BAK" but instead typed "rm * .BAK".
  653. Fortunately, I hadn't made too many changes since the last backup to tape.
  654.  
  655. Bruce
  656.  
  657. ----Message 46 (1054 chrs) is----
  658. Mail-From: local user C410EL80 at 4-Nov-82 14:26:58-EST
  659. Date: 4 November 1982 1411-EST
  660. From: Ellen Lowenfeld at CMU-10A
  661. Subject: Re: Hacking Horror Stories
  662. To: Brad Allen
  663.  
  664. This one's kind of embarrassing, looking back on it...  When I was
  665. a sophomore at Brown, I took a course which had a big project, I guess
  666. like 311 here, except that the groups were pairs.  So that I and my partner
  667. could test pre-compiled code separately (IBM 370, batch mode) we each
  668. had a dummy main routine.  Mine printed its name, and then called whatever
  669. routine(s) I wanted to test.  Unfortunately, I left out the quotes around
  670. its name, and sent it into infinite recursion.  IBM's great error message
  671. once I found it after looking in 3 manuals, and poring over pages of
  672. IEFH01X (or something like that), was "user error".  Not until I had
  673. spent most of a day looking for a wizard did I go back and just look
  674. at the code I had written.  Was my face red when all the people I had
  675. talked to while trying to find out the problem asked what it turned out
  676. to be!
  677. ----Message 47 (1310 chrs) is----
  678. Mail-From: CMUFTP host CMU-RI-FAS received by CMU-10A at 4-Nov-82 14:38:21-EST
  679. Date: 4 Nov 1982 13:09:55-EST
  680. From: Neil.Swartz at CMU-RI-FAS at CMU-10A
  681. To: ba0c@cmua
  682. Subject: Horror stories
  683.  
  684. Several stories come to mind.  At Princeton, they had WATFIV on a 360/91.
  685. You got 2 seconds of computer time and 600 lines of output.  One job came
  686. out in WATFIV that printed a line of characters and then overstruck the
  687. characters again and again.  The computer counted this as one line so it
  688. would do this forever.  The print heads tore through the paper, the ribbon
  689. and started in on the carriage.  The system was down for more than 12 hours.
  690.  
  691. Another good one which I have heard about- (If anybody knows more about this
  692. I would like to hear about it)  The Phantom Teletype Program.   The way it
  693. worked was this: At a random time interval the program would start up and
  694. pick a teletype on the system.  It would print "The Phantom Teletype Strikes
  695. Again!!" and then it would copy itself somewhere else on disk, set up the
  696. parameters for its re-execution, and delete the old copy.  System
  697. programmers could find out where it had been, but not where it was
  698. currently.  Because it was too difficult to track, they left it on the
  699. system.
  700.  
  701. There are lots of good(bad) stories running around.
  702.         Neil
  703.  
  704. ----Message 49 (2598 chrs) is----
  705. Mail-From: ARPANET host UTexas-20 received by CMU-10A at 4-Nov-82 16:41:21-EST
  706. Date:  4 Nov 1982 1538-CST
  707. From: CMP.LSMITH at UTEXAS-20
  708. Subject: some horror stories
  709. To: brad.allen at CMU-10A
  710.  
  711. My first hacking horror story goes back to my very first
  712. programming course. My program kept exceeding its time limit and
  713. aborting. I checked my code carefully and decided it was correct,
  714. but only needed a little more time to finish. So I confidently
  715. upped my limit from 7 seconds to a CPU minute of CDC 6600 time. I
  716. was really horrified when it timed out again, blowing my entire
  717. semester's allotment. A sharp consultant found my bug. I made the
  718. FORTRAN equivalent of "FOR X = 1.0 BY 0.1 TO 10.0," with my final
  719. test an equal. Since 0.1 is a repeating fraction in binary, it
  720. never equaled 10, so it went past and on to infinity.
  721.  
  722. Years later I was working on a PDP11/45 Unix system.  The system
  723. began crashing some time after we retrieved something from the
  724. backup tapes, using Unix's raw mode access to the tape. In cooked
  725. mode, things worked right, so we knew it couldn't be a hardware
  726. problem.  After some months of trying to debug the problem, we
  727. modified the tape device handler so that it spun and monitored
  728. its registers until the transfer completed. One of the high bits
  729. in the address register was sticking off. In cooked mode, Unix
  730. read into its system buffers in low core and everything worked
  731. because that bit stayed off anyway. In raw mode, it read into
  732. user space directly.  Whenever the address register was
  733. incremented past that bit boundary, the DMA transfer would drop
  734. down and wipe out some random locations and the system would
  735. slowly collapse.
  736.  
  737. The worst horror stories are when you spend days hacking at a
  738. program, only to discover that you've invoked a compiler bug.  We
  739. are extremely fortunate to have the ELISP system. I had a problem
  740. with a lengthy computation sometimes returning NIL from compiled
  741. code. Between the (RETURN RESULT) in the called function and
  742. (SETQ X (CALLED ...)) in the caller, the value was being lost.
  743. Interpreted, it worked. If I traced the function, it worked. If I
  744. traced any function in a chain below it, it worked.  It turns out
  745. that if you have a chain of calls about 10 deep, then a MAPCAR
  746. over a list of at least 3 values, then about three more calls
  747. down, and all the functions are compiled, then the time bomb NIL
  748. is stuck up on the stack. If any function in the chain is
  749. interpreted, for example by tracing it, then the behavior goes
  750. away. As far as I know, this bug still hasn't been found.
  751. -------
  752. ----Message 50 (1130 chrs) is----
  753. Mail-From: CMUFTP host CMU-CS-IUS received by CMU-10A at 4-Nov-82 21:16:47-EST
  754. Date: 4 Nov 1982 20:08-EST
  755. From: Victor.Milenkovic at CMU-CS-IUS at CMU-10A
  756. Subject: Re: Hacking Horror Stories
  757. To: Brad.Allen at CMU-10A
  758. Message-Id: <82/11/04 2008.913@CMU-CS-IUS>
  759.  
  760. One version of the PL/I debugger at Yorktown had no provision for
  761. displaying the hex values of pointer variables.  However, it would, on
  762. request, display the hex address of any other type of variable, as well
  763. as its value.  And so, in my program, I would create records,
  764. containing a single float variable, based at the pointer I wanted to
  765. see, and recompile.  By requesting the address of these records, I
  766. could determine the value of the pointer.
  767.  
  768. In PL/I one can allocate an area of memory and declare offset variables
  769. into it.  One can freely assign offset variables into pointer variables
  770. and back again -- or so I thought.  If a pointer to offset assignment
  771. results in a negative offset, nothing complains (although it should),
  772. but if one assigns the offset back to the pointer, it gets garbage.
  773. This peculiarity caused a very tenacious bug.
  774. ----Message 51 (304 chrs) is----
  775. Mail-From: local user C410BL03 at 4-Nov-82 21:52:38-EST
  776. Date:  4 November 1982 2151-EST (Thursday)
  777. From: Bruce.Leverett at CMU-10A
  778. To: Brad.Allen at CMU-10A
  779. Subject: Re: hacking horror stories
  780. In-Reply-To: <04Nov82 210911 BA0C@CMU-10A>
  781. Message-Id: <04Nov82 215100 BL03@CMU-10A>
  782.  
  783. Don't remember.
  784. ----Message 52 (2968 chrs) is----
  785. Mail-From: local user C425EC0F at 4-Nov-82 22:12:20-EST
  786. Date:  4 November 1982 2210-EST
  787. From: eddie caplan at CMU-10A
  788. To: brad allen at CMU-10A
  789. Subject: hacking horror stories
  790.  
  791. i was doing research in the computer music lab.  i was trying to
  792. generate emotional responses in subjects by producing sympathetic
  793. vibrations from the 64 loudspeakers surrounding the listening room.
  794. normally, we would add sub- and ultrasonic frequencies to classical
  795. "standards", and then play them to the subjects.
  796.  
  797. now, usually we just use frequency modulation to synthesize the
  798. instruments of the classic orchestras.  but one day as i was
  799. making an undergraduate volunteer retch to beethoven's seventh
  800. symphony, a thought struck me.  if i changed to additive synthesis
  801. for the instruments, i could elicit REALLY BIG responses!  i mean,
  802. i had been having pretty good results up 'til then, and i wasn't
  803. complaining.  but, with FM there was lots of data lost.  additive
  804. synthesis would make the music itself generate an emotional response.
  805. full fidelity beethoven combined with me could convert hasidic jews to
  806. catholicism!
  807.  
  808. so, i spent the next week redoing the beethoven.  i finished at
  809. 2:30am, and the only other person around was my officemate, dana.
  810. i asked her if she had heard beethoven's seventh recently.  i told
  811. her that i had a recording of boston symphony conducted by klaus
  812. tennstedt.  i still remember her eyes lighting up at the prospect. i
  813. hated to lie to  her, but she couldn't be told the  truth or the data
  814. would be tainted.  i had to  expose her to it without her suspecting.
  815. i put dana into the listening room and turned on the music with
  816. my sub- and ultrasonic frequencies added.
  817.  
  818. i watched through the soundproof glass from the observation room.
  819. during the first movement, dana cried uncontrollably.  she curled
  820. up in the chair and wimpered.  dana laughed insanely, and had what
  821. appeared to be several orgasms.
  822.  
  823.    "i've done it!", i cried.
  824.  
  825. but then, the second movement began.  i shudder still when i think
  826. of it.  i looked in at dana.  she was sitting upright in the chair,
  827. staring straight ahead, her hands gripping her knees.  there was
  828. blood starting to drip from her fingernails.  she was becoming
  829. catatonic and starting to shake.  i had to halt the processor before
  830. permanent damage was done.  but before i was able to stand, dana
  831. let out an excrutiating scream.  she shook violently and fell to the
  832. floor.  then, dana began to float into the air.  i pulled open
  833. the door and rushed into the listening room.  dana was screaming far
  834. above my head.  beethoven was screaming from the 64 speakers.
  835.  
  836. then, i called her name.  it was too much.  dana dissolved.
  837.  
  838. i think that the added sound of me yelling to her exceeded the 
  839. threshold.  i know now that i am to blame for her dissolving, and
  840. that i'm responsible for bringing her back.  perhaps it can be done
  841. with bartok.  dana always liked bartok.
  842.  
  843. eddie
  844. ----Message 53 (2694 chrs) is----
  845. Mail-From: CMUFTP host CMU-CS-Spice received by CMU-10A at 4-Nov-82 22:58:54-EST
  846. Date: 4 Nov 1982 22:08-EST
  847. From: Rob.MacLachlan at CMU-CS-SPICE at CMU-10A
  848. Subject: Hacking Horrors
  849. To: Brad.Allen@cmua
  850. Message-Id: <82/11/04 2208.881@CMU-CS-SPICE>
  851.  
  852. I ran into my most obsure bug last summer when I was working on a boot image
  853. builder for Accent to run under Accent.  What I had to do was convert the
  854. original program, which had POS filesystem calls that read and wrote random
  855. things scattered throughout it to use the Accent primitives, which are read
  856. and write an entire file.  After factoring this code out into a separate
  857. module I found that the program died the same way about one time out of
  858. five.  Since the debugger was virtually non-existant I proceeded to put in
  859. debugging code.  First I put in a check where it was dying for the fatal
  860. condition, which would print various information.  I found that when the
  861. error occured the cause was that the Pascal Get intrinsic was returning a
  862. random value instead of the correct one, but no particular pattern was
  863. observable.  I then put in code to dump the contents of the pascal file
  864. object after every value read from the file to see if it was getting
  865. clobbered; with this code in place the program died with an illegal memory
  866. reference inside the system print routine inside of one of the debugging
  867. WriteLn's.  At this point it was obvious that something earlier in the
  868. program was damaging the environment somehow, so I tried successively
  869. commenting out earlier parts of the program to find the offending code, and
  870. I found that if I did not read an earlier file, than the problem did not
  871. occur.  This caused me to suspect my file handling module, so I put
  872. debugging code in it to check that all of the pointers it was returning were
  873. valid.  When this debugging code was inserted the program then died earlier
  874. in the program, but this time consistantly during the reading of the third
  875. microcode file.  Insertion of debugging code at this point revealed that to
  876. a point the buffer contained the correct data, but the rest was zero.  At
  877. this point I felt reasonably sure that I had found a bug in Accent, so I
  878. called in the wizards, who looked at the address of the buffer and said: 'Oh
  879. that crosses a 64k boundry'.  Evidently it was a "Known" bug that a pascal
  880. object could not cross a 64k boundry, because the address calculations wrap
  881. around, and the ReadFile routine I was calling read the file into a place in
  882. memory such that it crossed a 64k boundry.  The Execution of the debugging
  883. code I put in caused storage to be allocated, thus causing the heap to cross
  884. a 64k boundry earlier in the program.
  885. ----Message 54 (1784 chrs) is----
  886. Mail-From: local user C410TL19 at 5-Nov-82 01:22:19-EST
  887. Date:  5 November 1982 0122-EST (Friday)
  888. From: Tom.Lane at CMU-10A
  889. To: Brad.Allen at CMU-10A
  890. Subject: Re: Hacking Horror Stories
  891. Message-Id: <05Nov82 012212 TL19@CMU-10A>
  892.  
  893.   Well, after reading your accumulated file I felt like I should
  894. contribute one of my own.
  895.   I have spent too many years of my life hacking systems which tried to
  896. enlarge a processor's address space by using software-controlled bank
  897. switching (C.mmp/Hydra & Cm* locally, Hewlett-Packard 9845 out in the
  898. real world; personal computing CP/M systems seem to be going down the
  899. same garden path). These machines extend a processor with (say) a 64K
  900. address space to handle megabytes, by dividing the processor address
  901. space into two to 16 blocks. Each block is mapped to a block of physical
  902. memory by means of an associated processor register. Accessing a
  903. particular memory location requires loading up one of the map registers
  904. with the block number of the location, then accessing the processor-
  905. visible address "register number * block size + location's offset
  906. within block".
  907.   This scheme is a LOSER. The majority of bugs found in each system
  908. I have worked with have been directly related to bank switching;
  909. it's just too easy to forget to load or restore a map register.
  910. This leads to reading or clobbering semi-random locations in blocks
  911. other than the one wanted. Worse, the bugs are often very difficult
  912. to duplicate, since they only show up when two data structures being
  913. manipulated at once happen to reside in different physical blocks.
  914. HP's testing records showed that 75% of the bugs discovered during
  915. system testing were of this ilk; many of them required an unreasonable
  916. amount of effort to track down.
  917.                                 tom lane
  918. ======================== END OF FILE ============================
  919.  
  920.