Article 167382 of comp.os.vms: Handy program; been meaning to write something like that forever, but never got 'round to it. However, it has a bug in it! In the function upc() void upc (char* s) { while (*s) *s = toupper (*s++); } the inner assignment statement uses s, and also increments it. The order in which the increment and the assignment through s occur is undefined by the C specifications; it was even undefined in K&R C. By chance, I happened to compile this code with VAX C. VAX C will in-line it quite happily. The out-of-line version - which is what you'll get if you disable optimizations, or even just in-lining - increment s using an INCL to refer to its location on the stack. It turns out that the INCL gets emitted after the assignment of the value returned by toupper(), so all goes well. However, the in-lined version of the code refers to its argument directly in a register, and uses auto-increment mode on the register to implement "*s++". As a result, the subsequent store uses the *incremented* value. The loop ends up over-writing any 0 in the string before it gets to it, and eventually ACCVIO's. The fix is to be avoid multiple side-effects in a single expression: void upc (char* s) { while (*s) { *s = toupper (*s); s++; } } -- Jerry