EXC_BAD_ACESS во время выполнения во время преобразования указателя - PullRequest
0 голосов
/ 06 декабря 2011

Я пытаюсь найти здесь ошибку, отладчик останавливается на следующем:

Pthread_create renderer passed

Renderer loop (re)started

Process 84779 stopped

* thread #4: tid = 0x3603, 0x0000000101546c4b libjess.so`render_deformation + 667 at renderer.c:472, stop reason = EXC_BAD_ACCESS (code=1, address=0x36f0000)

    frame #0: 0x0000000101546c4b libjess.so`render_deformation + 667 at renderer.c:472

   469         for (i = 0; i < resy*resx; i++)

   470       {

   471         aux  =  (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);

-> 472         *pix = *(aux) ;

   473         pix++;

   474         *pix = *(aux + 1);  
   475         pix++;

Я подозреваю, что это как-то связано с преобразованием указателя.Кто-нибудь может сказать мне, как лучше его разыграть?

Полный код функции (по запросу):

void render_deformation(int defmode)
{
   unsigned int bmax, *tab1, *tab2, *tab3, *tab4, i;
   unsigned char *pix = pixel , *buf = buffer, *aux;


   SDL_LockSurface(screen);

   /**************** BUFFER DEFORMATION ****************/



   if (video == 8)
     {
       buf = buffer;
       tab1 = table1;
       tab2 = table2;
       tab3 = table3;
       tab4 = table4;
       bmax = resx * resy + (unsigned int) pixel;

       switch(defmode)
     {
     case 0:
       memcpy(pixel,buffer,resx * resy);
       break;
     case 1:
       for (pix = pixel; pix < (unsigned char *) bmax ; pix++)
         *pix = *(buffer + *(tab1++)) ;
       break;
     case 2:
       for (pix = pixel; pix < (unsigned char *) bmax; pix++)
         *pix = *(buffer + *(tab2++)) ;
       break;
     case 3:
       for (pix = pixel; pix < (unsigned char *) bmax; pix++)
         *pix = *(buffer + *(tab3++)) ;
       break;
     case 4:
       for (pix = pixel; pix < (unsigned char *) bmax; pix++)
         *pix = *(buffer + *(tab4++)) ;
       break;   
     default:
       printf("Problem with blur_mode\n");
     }
     }
   else
     {
       pix = pixel;

       bmax = resx * resy;
       switch(defmode)
     {
     case 0:
       memcpy(pixel, buffer, pitch * resy);
       goto nodef;
       break;
     case 1:
       tab1 = table1;
       break;
     case 2:
       tab1 = table2;
       break;
     case 3:
       tab1 = table3;
       break;
     case 4:
       tab1 = table4;
       break;

     default:
       printf("Problem with blur_mode\n");
     }
       for (i = 0; i < resy*resx; i++)
     {
       aux  =  (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);
       *pix = *(aux) ;
       pix++;
       *pix = *(aux + 1);  
       pix++;
       *pix = *(aux + 2);  
       pix+=2;
       tab1++;
     }
       nodef:;

     }


   SDL_UnlockSurface(screen);
}

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011
aux = (unsigned char ) (((tab1) << 2 ) + (unsigned int) buffer);

Я предполагаю, что это должно было быть:

aux = (unsigned char *) (((tab1) << 2 ) + (unsigned int) buffer);

255 - это очень маленькое значение или диапазон для указателя ...

Но требуется больше кода, по крайней мере, целая функция плюс соответствующие определения / объявления (что такое «буфер»? Почему он приводится к unsigned int?).

ОБНОВЛЕНИЕ 111206:

Аналогичная вещь, похоже, имеет место с

bmax = resx * resy + (unsigned int) pixel;

Что, вероятно, должно быть:

bmax = resx * resy + (unsigned int*) pixel;

И

aux  =  (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);

Что, вероятно, должно быть

aux  =  (unsigned char) ((*(tab1) << 2 ) + (unsigned int*) buffer);

или

aux  =  (unsigned char*) ((*(tab1) << 2 ) + (unsigned int) buffer);

Это основная арифметика указателей: это либо pointer := pointer + scalar;, либо pointer = scalar + pointer;, но pointer := pointer + pointer; не имеет смысла. Первый вариант является наиболее вероятным (в противном случае приведения не были бы необходимы).

Не уверен насчет размеров типов, но они должны быть по крайней мере указателями.

Там все еще есть неправильный набор текста:

for (pix = pixel; pix < (unsigned char *) bmax ; pix++) {...}

Пиксель и пиксель - это символ *; bmax - беззнаковое целое; литой воняет. Я бы ожидал что-то вроде:

for (pix = pixel; pix < pixel+bmax ; pix++) {...}

, и, возможно, предел (bmax) следует даже умножить на 4, чтобы освободить место для 24 + 8 бит на цветовое пространство ячейки.

0 голосов
/ 06 декабря 2011

Вероятно, происходит то, что в строках 472 и 474 вы сохраняете данные по адресу памяти, указанному в пикселях, по адресу, указанному aux, но ваш процесс не имеет возможности доступа к одному или обоим этим адресам. Убедитесь, что вы правильно распределили эту память.

...