Компиляция mpeg4ip приводит к разыменованию ошибки указателя типа

0

Я пытаюсь скомпилировать mpeg4ip в linux box (Redhat 9), и я получаю много ошибок, потому что он, очевидно, больше не поддерживается. Это ошибка, которую я получаю:

make[5]: Entering directory '/home/ec2-user/mpeg4ip-1.5.0.1/lib/rtp'
if /bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I.    -DDEBUG -Wall -Werror -g -O2 -Wall -Werror -W  -Wmissing-prototypes -Wmissing-declarations -Wbad-function-cast -Wwrite-strings -Wformat=2 -MT rijndael-alg-fst.lo -MD -MP -MF ".deps/rijndael-alg-fst.Tpo" -c -o rijndael-alg-fst.lo rijndael-alg-fst.c; \
then mv -f ".deps/rijndael-alg-fst.Tpo" ".deps/rijndael-alg-fst.Plo"; else rm -f ".deps/rijndael-alg-fst.Tpo"; exit 1; fi
 gcc -DHAVE_CONFIG_H -I. -I. -I. -DDEBUG -Wall -Werror -g -O2 -Wall -Werror -W -Wmissing-prototypes -Wmissing-declarations -Wbad-function-cast -Wwrite-strings -Wformat=2 -MT rijndael-alg-fst.lo -MD -MP -MF .deps/rijndael-alg-fst.Tpo -c rijndael-alg-fst.c  -fPIC -DPIC -o .libs/rijndael-alg-fst.o
cc1: warnings being treated as errors
rijndael-alg-fst.c: In function 'rijndaelEncrypt':
rijndael-alg-fst.c:126: error: dereferencing type-punned pointer will break strict-aliasing rules
rijndael-alg-fst.c:147: error: dereferencing type-punned pointer will break strict-aliasing rules
rijndael-alg-fst.c:170: error: dereferencing type-punned pointer will break strict-aliasing rules
rijndael-alg-fst.c: In function 'rijndaelDecrypt':
rijndael-alg-fst.c:274: error: dereferencing type-punned pointer will break strict-aliasing rules
rijndael-alg-fst.c:296: error: dereferencing type-punned pointer will break strict-aliasing rules
rijndael-alg-fst.c:318: error: dereferencing type-punned pointer will break strict-aliasing rules
make[5]: *** [rijndael-alg-fst.lo] Error 1
make[5]: Leaving directory '/home/ec2-user/mpeg4ip-1.5.0.1/lib/rtp'
make[4]: *** [all-recursive] Error 1
make[4]: Leaving directory '/home/ec2-user/mpeg4ip-1.5.0.1/lib/rtp'
make[3]: *** [all] Error 2
make[3]: Leaving directory '/home/ec2-user/mpeg4ip-1.5.0.1/lib/rtp'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory '/home/ec2-user/mpeg4ip-1.5.0.1/lib'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/ec2-user/mpeg4ip-1.5.0.1'
make: *** [all] Error 2

Метод нарушения (или, по крайней мере, один из них):

int rijndaelEncrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
    int r;
    word8 temp[4][4];

*((word32*)temp[0]) = *((word32*)(a   )) ^ *((word32*)rk[0][0]);
*((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[0][1]);
*((word32*)temp[2]) = *((word32*)(a+ 8)) ^ *((word32*)rk[0][2]);
*((word32*)temp[3]) = *((word32*)(a+12)) ^ *((word32*)rk[0][3]);
*((word32*)(b    )) = *((word32*)T1[temp[0][0]])
                                            ^ *((word32*)T2[temp[1][1]])
                                            ^ *((word32*)T3[temp[2][2]])
                                            ^ *((word32*)T4[temp[3][3]]);
*((word32*)(b + 4)) = *((word32*)T1[temp[1][0]])
                                            ^ *((word32*)T2[temp[2][1]])
                                            ^ *((word32*)T3[temp[3][2]])
                                            ^ *((word32*)T4[temp[0][3]]);
*((word32*)(b + 8)) = *((word32*)T1[temp[2][0]])
                                            ^ *((word32*)T2[temp[3][1]])
                                            ^ *((word32*)T3[temp[0][2]])
                                            ^ *((word32*)T4[temp[1][3]]);
*((word32*)(b +12)) = *((word32*)T1[temp[3][0]])
                                            ^ *((word32*)T2[temp[0][1]])
                                            ^ *((word32*)T3[temp[1][2]])
                                            ^ *((word32*)T4[temp[2][3]]);
    for (r = 1; r < ROUNDS-1; r++) {
            *((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[r][0]);
            *((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
            *((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
            *((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);

            *((word32*)(b    )) = *((word32*)T1[temp[0][0]])
                                                    ^ *((word32*)T2[temp[1][1]])
                                                    ^ *((word32*)T3[temp[2][2]])
                                                    ^ *((word32*)T4[temp[3][3]]);
            *((word32*)(b + 4)) = *((word32*)T1[temp[1][0]])
                                                    ^ *((word32*)T2[temp[2][1]])
                                                    ^ *((word32*)T3[temp[3][2]])
                                                    ^ *((word32*)T4[temp[0][3]]);
            *((word32*)(b + 8)) = *((word32*)T1[temp[2][0]])
                                                    ^ *((word32*)T2[temp[3][1]])
                                                    ^ *((word32*)T3[temp[0][2]])
                                                    ^ *((word32*)T4[temp[1][3]]);
            *((word32*)(b +12)) = *((word32*)T1[temp[3][0]])
                                                    ^ *((word32*)T2[temp[0][1]])
                                                    ^ *((word32*)T3[temp[1][2]])
                                                    ^ *((word32*)T4[temp[2][3]]);
    }
    /* last round is special */
    *((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[ROUNDS-1][0]);
    *((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[ROUNDS-1][1]);
    *((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[ROUNDS-1][2]);
    *((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[ROUNDS-1][3]);
    b[ 0] = T1[temp[0][0]][1];
    b[ 1] = T1[temp[1][1]][1];
    b[ 2] = T1[temp[2][2]][1];
    b[ 3] = T1[temp[3][3]][1];
    b[ 4] = T1[temp[1][0]][1];
    b[ 5] = T1[temp[2][1]][1];
    b[ 6] = T1[temp[3][2]][1];
    b[ 7] = T1[temp[0][3]][1];
    b[ 8] = T1[temp[2][0]][1];
    b[ 9] = T1[temp[3][1]][1];
    b[10] = T1[temp[0][2]][1];
    b[11] = T1[temp[1][3]][1];
    b[12] = T1[temp[3][0]][1];
    b[13] = T1[temp[0][1]][1];
    b[14] = T1[temp[1][2]][1];
    b[15] = T1[temp[2][3]][1];
    *((word32*)(b   )) ^= *((word32*)rk[ROUNDS][0]);
    *((word32*)(b+ 4)) ^= *((word32*)rk[ROUNDS][1]);
    *((word32*)(b+ 8)) ^= *((word32*)rk[ROUNDS][2]);
    *((word32*)(b+12)) ^= *((word32*)rk[ROUNDS][3]);

    return 0;
}

Может кто-нибудь, пожалуйста, предложите мне, как это исправить? Я нашел новые версии этого файла в Интернете (версия 3), но когда я пытаюсь реализовать, я получаю больше ошибок, чем вы можете встряхнуть палку. Заранее спасибо.

  • 0
    Обязательно попробуйте скомпилировать более новую версию. Какие ошибки вы получаете при этом? Что касается вышеприведенных ошибок, попробуйте использовать memcpy() или объединения вместо типа punning через pointerd, чтобы заставить замолчать предупреждения.
  • 0
    Как я могу использовать союзы и memcpy? Я так НЕ программист на C или C ++
Показать ещё 1 комментарий
Теги:

1 ответ

0

загрузите последний источник (версия mpeg4ip-1.6.1 для меня) из

ftp://ftp.netbsd.org/pub/pkgsrc/distfiles/mpeg4ip-1.6.1.tar.gz

(прокомментируйте строку 126 include/mpeg4ip.h, если отображается ошибка)

make and make install 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню