This is a fantastic weird bug that improved my noodles for most of the day; It took me a while to dump him on it.
Setup:
- Microsoft C 5.10 (~ 1988)
- DOSBox 0.74
- Windows 10 (64-bit)
Code ( double.c):
#include <stdio.h>
int main(int, char *[]);
int main(int argc, char *argv[])
{
int i;
double n;
if (argc > 1) {
puts(argv[1]);
}
for (i = 0; i < 9999; i++) {
n = 0.0;
if (n != 0.0) {
puts("ERROR1!");
return -1;
}
if (n != 0.0) {
puts("ERROR2!");
return -2;
}
}
return 0;
}
Reproduction:
- Compilation with MSC 5.1 without switches (
cl double.c) - Run double.exe
- Click to activate another application window (away from DOSBox)
- Return to DOSBox
- Repeat steps 2-4 until an error occurs
Screenshot:

Notes:
, . cl /help , /FPi . /FPc ( ) , ERROR1.
: , , , !
, , DOSBox 0.74 Linux Mint, 32- ATOM, .
, , , , -, , .
, /Fa:
; Static Name Aliases
;
TITLE double.c
NAME double
.8087
_TEXT SEGMENT WORD PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP
EXTRN __acrtused:ABS
EXTRN _puts:NEAR
EXTRN __chkstk:NEAR
EXTRN __fltused:NEAR
_DATA SEGMENT
$SG167 DB 'ERROR1!', 00H
$SG169 DB 'ERROR2!', 00H
_DATA ENDS
CONST SEGMENT
$T20001 DQ 0000000000r ; .0000000000000000
CONST ENDS
_TEXT SEGMENT
ASSUME CS: _TEXT
; Line 6
PUBLIC _main
_main PROC NEAR
push bp
mov bp,sp
mov ax,12
call __chkstk
; argc = 4
; argv = 6
; i = -2
; n = -10
; Line 10
cmp WORD PTR [bp+4],1 ;argc
jle $I162
; Line 11
mov bx,WORD PTR [bp+6] ;argv
push WORD PTR [bx+2]
call _puts
add sp,2
; Line 12
; Line 14
$I162:
mov WORD PTR [bp-2],0 ;i
jmp SHORT $F163
$FC164:
inc WORD PTR [bp-2] ;i
$F163:
cmp WORD PTR [bp-2],9999 ;i
jge $FB165
; Line 15
fldz
fst QWORD PTR [bp-10] ;n
; Line 16
fcom QWORD PTR $T20001
fstp ST(0)
fstsw WORD PTR [bp-12]
fwait
mov ah,BYTE PTR [bp-11]
sahf
je $FC164
; Line 21
mov ax,OFFSET DGROUP:$SG169
push ax
call _puts
add sp,2
; Line 22
mov ax,-2
mov sp,bp
pop bp
ret
$FB165:
; Line 26
sub ax,ax
mov sp,bp
pop bp
ret
_main ENDP
_TEXT ENDS
END
!