2011-01-05 3 views
0

これは信じがたいことですが、これについて100%真剣です。MacBook Pro、Windows XP、VS 2008 Express EditionのプリミティブCプログラムの動作が壊れています

Windows XP Professional 32ビットSP3をネイティブで実行しているMacBook Pro(Core 2 Duo P8600)のVisual Studio 2008 Express Editionでリリースモードで以下のコードをコンパイルすると、実行ファイルを実行するとすぐにprintfが散発的にヒットします私はタッチパッド(冗談なし)に触れるので、間違いなく起こらないはずです。

私はアセンブリリストや追加情報を含むReadmeファイルに含むVisual Studio用のプロジェクトファイルとパッケージをアップロード:

www.pedram-azad.de/WeirdProblem.zip

を誰もが彼のMacBook Pro上で同じ問題(またはその他を再現することができますラップトップ)?誰もが問題の可能性があるものをアセンブリリストに見ることができますか?

私の推測では、タッチパッドドライバは何とか浮動小数点比較を担当するレジスタを操作することができます。整数の場合、問題は発生しません。

ここで何が起こっているかについてのご意見は大歓迎です。

Pedram

#include <stdio.h> 

int main() 
{ 
    while (true) 
    { 
     float x = 1.0f; 

     for (int i = 0; i < 50; i++) 
     { 
      if (0.0f < x) 
       x = 0.0f; 
     } 

     if (x == 1.0f) 
      printf("bad: %.2f\n", x); 
    } 

    return 0; 
} 

ここでは、Visual Studio 2008 Expressエディションによって生成上記のコードのためのアセンブリリスト、次のとおりです。

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 

    TITLE c:\Dokumente und Einstellungen\azad\Desktop\WeirdProblem\main.cpp 
    .686P 
    .XMM 
    include listing.inc 
    .model flat 

INCLUDELIB MSVCRT 
INCLUDELIB OLDNAMES 

PUBLIC [email protected][email protected]@[email protected] ; `string' 
PUBLIC [email protected] 
PUBLIC [email protected] 
PUBLIC [email protected] 
PUBLIC _main 
EXTRN __imp__printf:PROC 
EXTRN __fltused:DWORD 
; COMDAT [email protected][email protected]@[email protected] 
; File c:\dokumente und einstellungen\azad\desktop\weirdproblem\main.cpp 
CONST SEGMENT 
[email protected][email protected]@[email protected] DB 'bad: %.2f', 0aH, 00H ; `string' 
CONST ENDS 
; COMDAT [email protected] 
CONST SEGMENT 
[email protected] DD 000000000r   ; 0 
CONST ENDS 
; COMDAT [email protected] 
CONST SEGMENT 
[email protected] DQ 00000000000000000r ; 0 
CONST ENDS 
; COMDAT [email protected] 
CONST SEGMENT 
[email protected] DD 03f800000r   ; 1 
; Function compile flags: /Ogtpy 
CONST ENDS 
; COMDAT _main 
_TEXT SEGMENT 
_x$3834 = -4      ; size = 4 
_main PROC      ; COMDAT 

; 4 : { 

    push ebp 
    mov ebp, esp 
    and esp, -64    ; ffffffc0H 
    fld1 
    sub esp, 60     ; 0000003cH 
    fldz 
    push esi 
    fldz 
    mov esi, DWORD PTR __imp__printf 
    jmp SHORT [email protected] 
[email protected]: 

; 10 :  { 
; 11 :   if (0.0f < x) 
; 12 :    x = 0.0f; 
; 13 :  } 
; 14 : 
; 15 :  if (x == 1.0f) 

    fstp ST(0) 
    fxch ST(2) 
[email protected]: 
    fxch ST(2) 
    mov ecx, 10     ; 0000000aH 
    fst DWORD PTR _x$3834[esp+64] 
    fld DWORD PTR _x$3834[esp+64] 
[email protected]: 
    fcom ST(2) 
    fnstsw ax 
    test ah, 65     ; 00000041H 
    jne SHORT [email protected] 
    fstp ST(0) 
    fxch ST(2) 
    fst DWORD PTR _x$3834[esp+64] 
    fld DWORD PTR _x$3834[esp+64] 
    fxch ST(1) 
    fxch ST(3) 
    fxch ST(1) 
[email protected]: 
    fcom ST(2) 
    fnstsw ax 
    test ah, 65     ; 00000041H 
    jne SHORT [email protected] 
    fstp ST(0) 
    fxch ST(2) 
    fst DWORD PTR _x$3834[esp+64] 
    fld DWORD PTR _x$3834[esp+64] 
    fxch ST(1) 
    fxch ST(3) 
    fxch ST(1) 
[email protected]: 
    fcom ST(2) 
    fnstsw ax 
    test ah, 65     ; 00000041H 
    jne SHORT [email protected] 
    fstp ST(0) 
    fxch ST(2) 
    fst DWORD PTR _x$3834[esp+64] 
    fld DWORD PTR _x$3834[esp+64] 
    fxch ST(1) 
    fxch ST(3) 
    fxch ST(1) 
[email protected]: 
    fcom ST(2) 
    fnstsw ax 
    test ah, 65     ; 00000041H 
    jne SHORT [email protected] 
    fstp ST(0) 
    fxch ST(2) 
    fst DWORD PTR _x$3834[esp+64] 
    fld DWORD PTR _x$3834[esp+64] 
    fxch ST(1) 
    fxch ST(3) 
    fxch ST(1) 
[email protected]: 
    fcom ST(2) 
    fnstsw ax 
    test ah, 65     ; 00000041H 
    jne SHORT [email protected] 
    fstp ST(0) 
    fxch ST(2) 
    fst DWORD PTR _x$3834[esp+64] 
    fld DWORD PTR _x$3834[esp+64] 
    fxch ST(1) 
    fxch ST(3) 
    fxch ST(1) 
[email protected]: 

; 5 : while (true) 
; 6 : { 
; 7 :  float x = 1.0f; 
; 8 : 
; 9 :  for (int i = 0; i < 50; i++) 

    sub ecx, 1 
    jne [email protected] 

; 10 :  { 
; 11 :   if (0.0f < x) 
; 12 :    x = 0.0f; 
; 13 :  } 
; 14 : 
; 15 :  if (x == 1.0f) 

    fld ST(1) 
    fucomp ST(1) 
    fnstsw ax 
    test ah, 68     ; 00000044H 
    jp [email protected] 
    fstp ST(2) 

; 16 :   printf("bad: %.2f\n", x); 

    sub esp, 8 
    fstp ST(2) 
    fstp ST(1) 
    fstp QWORD PTR [esp] 
    push OFFSET [email protected][email protected]@[email protected] 
    call esi 

; 17 : } 

    fld1 
    fldz 
    add esp, 12     ; 0000000cH 
    fldz 
    jmp [email protected] 
_main ENDP 
_TEXT ENDS 
END 
+0

私はプログラムが積極的に何か悪いことをしようとしているわけではないので、悪意のある行動とは言いません。とにかく、GCC 4.5.2でLinux上でテストしたところ、printfは決して呼び出されませんでした。 – kmm

+0

おそらく、正しいハードウェアで間違ったO/Sを実行していることをMicrosoftに伝える方法です。 FWIW:GCC 4.5.2でコンパイルされたMacOS X 10.6.5(Core 2 Duoチップ)上で実行された場合、コードは不都合な挙動を示さなかった。 –

+0

スイッチを「もっと魔法」にフリックしようとしましたか? – derkyjadex

答えて

0

私はタッチパッドのドライバのことができるようにする方法を表示されませんこの種の行動を起こす。

これは何らかのハードウェアの問題です。万が一MacBookをオーバークロックしましたか?あなたがそれをオーバークロックすると、CPUはあらゆる種類の奇妙なことをやり始めます(Eric Raymond has some war stories to tell of this)。あなたがオーバークロックしていないのであれば、あなたのCPUはちょうど暑すぎるでしょうか?冷却用通気口を確認することをお勧めします。あるいは単なるフレークなCPUかもしれません。

の場合は、タッチパッドに触れるとどうしてですか?純粋な投機ですが、タッチパネルからの電力消費がCPUの電圧を下げて、愚かなことを起こすだけのものになります。

+0

私はMacBookをオーバークロックしていません。私はCPUがあまりにも熱くなっているとは思わない。なぜなら、これは起動直後でも起こるからだ。それはMac OS Xでも起こるわけではないので、私はCPUが正常であると仮定します。 Visual Studio 6で同じコードをコンパイルしても、それは起こりません。 パワードレインがCPU電圧を下げるという興味深い考え方。私はそれがそれのようなものであることを疑うことはありません。問題は、特定のOSと特定のコンパイラでのみ発生するのはなぜですか? –

+0

タッチパッドドライバがこのようなことを引き起こす可能性は驚くことではありません。タッチパッドは、ドライバが浮動小数点演算の必要性を見つける非常に少数のデバイスの1つになります。 – caf

+0

タッチパッドドライバはFPUを使用するのが妥当です。しかし、私の理解のために、ドライバがFPUの状態を他のタスク(例えば、ユーザアプリケーション)のために破壊することは不可能であるべきである。私はそれが次のいずれかでなければならないと言うでしょう:(1)OSのバグ、(2)コンパイラのバグ、(3)ハードウェアのバグ。 –

1

FPUと最適化と関係があるかもしれません。 xvolatile floatと定義するか、/O0を指定してコンパイルすると起こりますか?そうであれば、おそらくバギードライバーはFPUの状態を変更します。

+0

'volatile'は頻繁に起こらず、/ Od(VC 2008ではすべての最適化が無効になっていることを意味します)では、発生頻度を最小限に抑えます。バグのあるドライバは、ユーザアプリケーションに切り替えた後にOSが状態を復元することなく、FPUの状態を変更できますか? –

+0

まあ、理論的には起こるべきではありませんが、あなたが見ていることは起こっているように見えます。私は本当に理由を示唆するためにWindowsドライバについて十分に知りません... – StasM

関連する問題