LINUX.ORG.RU

[C Programming] Help needed


0

0

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45160

В двух словах: есть некая библиотека FAAD2, которую GCC >= 4.4.0 компилирует неправильно, из-за кривого кода.

Есть волонтёры исправить исходники? (Всего около 10 warning'ов в одном(!) файле).

Прошу без ответов «не надо», «исправь сам» и т.д.

Ну будет как-то так (на правильность работы не проверял):

--- a/faad2-2.7/libfaad/ic_predict.c    2009-05-31 11:02:54.000000000 +0400
+++ b/faad2-2.7/libfaad/ic_predict.c    2010-09-07 00:59:04.237565173 +0400
@@ -37,47 +37,49 @@
 #include "ic_predict.h"
 #include "pns.h"

+typedef union
+{
+    float32_t f;
+    uint32_t u;
+} hack32_t;

 static void flt_round(float32_t *pf)
 {
     int32_t flg;
-    uint32_t tmp, tmp1, tmp2;
+    hack32_t tmp, tmp1, tmp2;

-    tmp = *(uint32_t*)pf;
-    flg = tmp & (uint32_t)0x00008000;
-    tmp &= (uint32_t)0xffff0000;
-    tmp1 = tmp;
+    tmp.f = *pf;
+    flg = tmp.u & (uint32_t)0x00008000;
+    tmp.u &= (uint32_t)0xffff0000;
+    tmp1.u = tmp.u;
     /* round 1/2 lsb toward infinity */
     if (flg)
     {
-        tmp &= (uint32_t)0xff800000;       /* extract exponent and sign */
-        tmp |= (uint32_t)0x00010000;       /* insert 1 lsb */
-        tmp2 = tmp;                             /* add 1 lsb and elided one */
-        tmp &= (uint32_t)0xff800000;       /* extract exponent and sign */
+        tmp.u &= (uint32_t)0xff800000;       /* extract exponent and sign */
+        tmp.u |= (uint32_t)0x00010000;       /* insert 1 lsb */
+        tmp2.u = tmp.u;                             /* add 1 lsb and elided one */
+        tmp.u &= (uint32_t)0xff800000;       /* extract exponent and sign */

-        *pf = *(float32_t*)&tmp1 + *(float32_t*)&tmp2 - *(float32_t*)&tmp;
+        *pf = tmp1.f + tmp2.f - tmp.f;
     } else {
-        *pf = *(float32_t*)&tmp;
+        *pf = tmp.f;
     }
 }

 static int16_t quant_pred(float32_t x)
 {
-    int16_t q;
-    uint32_t *tmp = (uint32_t*)&x;
-
-    q = (int16_t)(*tmp>>16);
+    hack32_t tmp;
+    tmp.f = x;

-    return q;
+    return (int16_t)(tmp.u>>16);
 }

 static float32_t inv_quant_pred(int16_t q)
 {
-    float32_t x;
-    uint32_t *tmp = (uint32_t*)&x;
-    *tmp = ((uint32_t)q)<<16;
+    hack32_t tmp;
+    tmp.u = ((uint32_t)q)<<16;

-    return x;
+    return tmp.f;
 }

 static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred)
Deleted
()

faad2 2.7 в дистрибутивах собрана gcc 4.4 - всё собирается и работает.

Led ★★★☆☆
()
Ответ на: комментарий от mv

> Напиши Линусу, скажи, что его Линукс плохой

Только сначала надо подготовиться к тому, что тебя после этого назовут мастурбирующей обезьяной.

fang
()
Ответ на: комментарий от fang

Лучше Дрепперу писать, он такие багрепорты любит до безумства.

mv ★★★★★
()
Ответ на: комментарий от fang

>Только сначала надо подготовиться к тому, что тебя после этого назовут мастурбирующей обезьяной.

А что плохого в том, чтобы назвать мастурбирующую обезьяну мастурбирующей обезьяной?

Led ★★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.