sexta-feira, 21 de fevereiro de 2014

Bounds Index checking ( Checando índice limite do vetor )


Um método utilizado em programação para evitar referenciar itens que ultrapassem os limites de um vetor afim de controlar o problema de maneira segura. Em linguagens de mais alto nível como Java e C# este artificio já é implementado automaticamente gerando uma exceção que pode ser controlada pelo programa, porém existe o custo em tempo de execução desta verificação, afinal toda vez que é necessário referenciar um item do vetor esta verificação será feita. Linguagens como C e C++ não implementam automaticamente esta verificação e deixam a responsabilidade para o programador que pode optar por mais segurança ou evitar a verificação e tornar a execução mais rápida. Apesar de haver uma grande discussão sobre este assunto onde uns acham que o ganho de performance não vale o risco o fato é que a alternativa existe para cada programador escolher em seu caso qual a alternativa melhor para seu contexto.

Ex.:

#include

#define SIZE_VETOR 7
char vetor[SIZE_VETOR] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; //Escopo Global

void getItem( int indice, char * out ){
       *out = vetor[indice];
};


int main( int argc, char ** argv, char ** argenv ){

   char c = 0;

   getItem(0, &c); //neste momento foi referenciado o item 0 do vetor sendo o valor 'a' OK

   printf( "%c", c );

   getItem(6, &c); //neste momento foi referenciado o item 6 do vetor sendo o valor 'g' OK

   printf( "%c", c );

   getItem(10, &c); //neste momento foi referenciado o item 10 do vetor FALHA

   printf( "%c", c );

   return 1;

};

Uma maneira de evitar o crash de seu sistema  e o mesmo ser finalizado abruptamente na linha onde sinalizei a falha seria efetuar uma checagem antes de referenciar afim de identificar o problema e tratá-lo da melhor forma possível, uma forma bem didática seria efetuar um if antes de cada referencia e tratar o erro para isso seria necessário modificar a função getItem:

#include

#define SIZE_VETOR 7
char vetor[SIZE_VETOR] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; //Escopo Global

int getItem( int indice, char * out ){

    if(  indice < SIZE_VETOR && indice > SIZE_VETOR )
       *out = vetor[indice];
       return 1; //SUCESSO
  else
      *out = -1; //FALHA
      return 0;
};

int main( int argc, char ** argv, char ** argenv ){

   char c = 0;
 
   if( getItem(0, &c) //neste momento foi referenciado o item 0 do vetor sendo o valor 'a' OK
      printf( "%c", c );
   else
      printf( "ERRO: índice incorreto" );

   if( getItem(6, &c) //neste momento foi referenciado o item 6 do vetor sendo o valor 'g' OK
      printf( "%c", c );
   else
      printf( "ERRO: índice incorreto" );

   if( getItem(10, &c) //neste momento foi referenciado o item 10 do vetor FALHA
      printf( "%c", c );
   else
      printf( "ERRO: índice incorreto" );


   return 1;

};

Ressalto que o exemplo acima é somente montado para fins didáticos sendo possível efetuar a checagem de maneira mais eficiente.







Nenhum comentário:

Postar um comentário