코드 품질 향상을 위해 코드를 다듬다.(IV)

코딩 규칙(Coding rule)

 

선언한 배열에 대해 실행 중에 특정한 경우에 배열의 범위를 벗어나 값을 설정하는 경우는 메모리의 데이터를 잘못된 값으로 변경하기 때문에 다양한 현상으로 오류가 발생되며, 인지되지 않는 경우도 있습니다. 이러한 오류는 내재되어 있다가 코드의 변화가 있는 경우 표출될 수 있으므로 오류를 수정하기가 쉽지 않습니다.

 

다음의 예제는 배열의 범위를 벗어나 값을 설정하는 오류입니다. 코드가 여러 위치에서 배열을 사용 한다면 오류 사항을 인지 하기는 쉽지 않습니다.

만약 배열이 자동 변수(Auto Variables)로 선언되었는데 앞에서 언급된 내용처럼 범위를 벗어나서 값을 넣는 경우는 시스템에 치명적인 오류를 발생합니다. 자동 변수는 스택에 할당되기 때문에 배열 밖의 영역에 값을 쓰는 경우에는 스택에 저장된 복귀 주소등과 같은 정보가 변경되어 잘못된 주소로 점프하여 시스템이 리셋이 될 수 도 있습니다.

 

int cond;

 

int main(void)

{

int a[7];

int x;

if (cond)

x = 3;

else

x = 20;

a[x] = 0; //x may be set to 20 in line 11

//but a only has an interval of [0,6]

return 0;

}

 

다음과 같이 배열의 영역을 충분히 확보하고, 유효한 배열의 위치에서 접근하도록 하여야 합니다.

 

int cond;

 

int main(void)

{

int a[25];

int x;

if (cond)

x = 3;

else

x = 20;

a[x] = 0; //here, both possible values of

//x are in the interval [0,24]

return 0;

}

 

다음은  코딩 작업을 하면서 쉽게 발생할 수 있는 예제 중에 하나입니다.

If , for, while 문의 조건식에서 TRUE나 FALSE를 검사하는 표현식 안에서의 ++  또는 --연산자를 사용하는 경우는 오류를 발생할 수 있습니다. position++; 를 if 문에서 MAX _BUF와 비교를 하는 코드 입니다. 이런 경우에는 position값은 1증가되지만, 증가되기 전의position 값으로 MAX_BUF와 비교를 합니다. 그러므로 position이 10이라면 11로 변경되지만, 비교되는 값은 10이므로 배열의 범위를 벗어나 값을 변경하게 됩니다. 자세한 내용은 실행 코드의 동작을 확인해보면 쉽게 알 수 있습니다.

 

#define MAX_BUF 10

unsigned char TxBuf[MAX_BUF];

 

int PutTxBuf(char ch)

{

If((position++) > MAX_BUF ){

     Position = 0;

   }else{

     TxBuf[Position] = ch;

  }

}

 

그래서 이런 오류를 방지하기 위해 다음과 같이 먼저 position++; 를 실행하고 if문에서는 position 값만을 비교하는 방식으로 코드를 변경해야 합니다.

 

int PutTxBuf(char ch)

{

   position++;

   If( position > MAX_BUF ){

     Position = 0;

   }else{

     TxBuf[Position] = ch;

  }

}

 

배열 사용에 있어 발생될 수 있는 오류 예제를  살펴 보았습니다. 메모리 영역을 잘못 접근하여 비 정상적인 값으로 설정되는 경우에는 오류를 인지하기가 매우 어렵습니다. 이러한 오류를 사전에 방지하는 것은 안정된 코드를 작성하는 데 중요한 사항입니다.

 

감사합니다.

본 글은 IAR 시스템즈 코리아 기술팀 고성용 상무가 작성하였습니다.

© IAR Systems 1995-2018 - All rights reserved.

해당 사이트는 쿠키를 사용합니다. 이 사이트를 사용하려면 쿠키를 허용해야 합니다. Cookies