2011-10-11 10 views
9

Mac OSX上でVorbis Oggファイルを読み込む際に不思議なバグがありました。最初のファイルが正しく読み込まれ、2番目のファイルが破損していることを示すコードがクラッシュします。同じファイルを2回読み込んでも同じことが起こります。MAC OSXインテルLLVMアセンブラのバグ(Vorbis OGGローダがクラッシュする)

Vorbisの中で深くデバッグした後、私はバグが完全な有効な入力のために(ナノ)を返すシステム関数 "pow"(二重の力)によって引き起こされていることを発見しました。 (ov_read)を呼び出すと、最初の呼び出しで "pow"に渡された同じ正確な値が有効な結果を返します。

8時間後、Intel x87のドキュメントが多数読んで、問題が見つかりました。押すとインテルFPUスタックに飛び出します

__asm__("fistl %0": "=m"(i) : "t"(f)); 

:長い話が短い、このアセンブリコードを使用する関数奥Vorbisの「vorbis_ftoi」があります。スタックにプッシュしていないが、決してFPUスタックオーバーフローを引き起こしポップ

fld QWORD PTR [ebp-0x20] 
fist DWORD PTR [ebp-0x14] 

:しかしLLVMのは、このコードを生成します。

fld QWORD PTR [ebp-0x20] 
fist DWORD PTR [ebp-0xc] 
fstp st(0)  // pops off the stack 

私は一日半、私のブライアンは、いくつかのゴミ(のx87命令セットとレジスタを学ぶのいくつかのバイトを無駄:そして、それはGCCによって生成された適切なコードは次のようになり

LLVM

に明らか バグです私はそれを分かち合いますが。

Auday

+2

Appleが提供するコードでバグが見つかったと思われる場合は、Appleに報告してください。https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/wa/signIn –

+0

done 、ありがとうNed – Auday

+0

+1私は彼らのコードの昨日のバグを見つけたので、またそれを報告しました。少なくとも私のものはコンパイラのクラッシュだったので、デバッグの時間はそれほど悪くはありませんでした。 –

答えて

2

優秀!ありがとうございました。別の解決方法は、単にasmを完全に削除することです。ここではパッチです:

--- lib/os.h 2011-11-13 20:36:24.000000000 -0500 
+++ lib/os.h  2011-11-15 18:45:00.000000000 -0500 
@@ -93,27 +93,16 @@ 
typedef ogg_int16_t vorbis_fpu_control; 

static inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ 
- ogg_int16_t ret; 
- ogg_int16_t temp; 
- __asm__ __volatile__("fnstcw %0\n\t" 
-   "movw %0,%%dx\n\t" 
-   "andw $62463,%%dx\n\t" 
-   "movw %%dx,%1\n\t" 
-   "fldcw %1\n\t":"=m"(ret):"m"(temp): "dx"); 
- *fpu=ret; 
} 

static inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ 
- __asm__ __volatile__("fldcw %0":: "m"(fpu)); 
} 

/* assumes the FPU is in round mode! */ 
static inline int vorbis_ftoi(double f){ /* yes, double! Otherwise, 
               we get extra fst/fld to 
               truncate precision */ 
- int i; 
- __asm__("fistl %0": "=m"(i) : "t"(f)); 
- return(i); 
+ return (int)floor(f+.5); 
} 
#endif /* Special i386 GCC implementation */ 
3

シンプルパッチ、LLVMでコンパイルした場合にのみ影響を与えています

--- Xiph\vorbis\os.h Mon Mar 28 08:42:43 2011 
+++ Xiph\vorbis\os.h Thu Feb 02 14:20:27 2012 
@@ -81,7 +81,7 @@ 


/* Special i386 GCC implementation */ 
-#if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__) 
+#if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__) && !defined(__llvm__) 
# define VORBIS_FPU_CONTROL 
/* both GCC and MSVC are kinda stupid about rounding/casting to int. 
    Because of encapsulation constraints (GCC can't see inside the asm 

残念ながら、私はOPを投票するのに十分な評判を持っているが、私は「ことを知りませんあなたの発見に感謝します。ありがとうございました。

+0

私はこの正確な問題も抱えていましたが、この修正が私のために働いていました。ありがとう! – Tod

関連する問題