Any ideas on this Microsoft C 5.1 floating point plan and DOSBox weirdness?

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:

DOSBox MSC 5.1 floating point memory corruption

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

!

+4

:

2745
?
1479
678
? 0?
373
?
168
?
78
60
-3
16-

Source: https://habr.com/ru/post/1662464/


All Articles