정적검사를 하다보면 검출된 위배 항목에 대해 무시처리를 해야하는 경우가 발생하게 됩니다.


위배무시처리를 하는 방법으로는 1. 주석으로 무시처리를 하거나 2. UI상에서 무시처리를 할 수 있는데요.

그렇게 위배 무시 처리한 후에 다시 정적검사를 수행하게 되었을 때


1. 주석으로 위배를 무시한 경우에는 해당 주석이 있는 곳은 위배 무시가 유지되지만,

2. UI 상에서 무시처리를 했을 경우에는 함수 내에서 검출된 위배의 경우 함수가 변경되지 않았을 때, 

   전역 위체에서 검출된 위배의 경우 소스파일의 내용에 변경이 없을 때만 위배 무시 내용이 유지됩니다.


여타 대부분의 다른 도구들처럼 함수/소스 내용의 변경에도 위배 무시를 유지하는 경우

아래와 같은 문제가 발생할 수 있습니다.




  • 소스 수정으로 인해 의도되지 않았던 위배를 무시하는 문제

타 도구 중에는 위배 무시 유지 기능을 사용할 경우 단순히 위배가 발생한 라인만을 이용하여 동작하는 경우가 있습니다. 따라서 소스 내용이 변경되어 원래 검토자가 의도하였던 위배가 아닌 새로운 위배가 발생하였으나, 기존에 작업했던 위배 무시 기능으로 해당 위배를 볼 수 없는 상황이 발생합니다. 

#include "header.h"

static int32_t g_arr[10] = {0, };

void func(int32_t arg1, int32_t arg2)
{
  if ((g_arr[0] == arg1) && (g_arr[1] == FIRST_INITIAL_VALUE) &&
      (g_arr[8] == THIRD_INITIAL_VALUE) && (g_arr[9] = arg2)) {

처음 분석시 8번 라인에서 발생한 위배를 무시처리했다고 가정합니다.

그 이후 수정된 소스에 대해 다시 검사를 수행하면,


#include "header.h"

static int32_t g_arr[10] = {0, };

void func(int32_t arg1, int32_t arg2)
{
  if ((g_arr[0] == arg1) && (g_arr[1] == FIRST_INITIAL_VALUE) &&
      (g_arr[3] = SECOND_INITIAL_VALUE) &&
      (g_arr[8] == THIRD_INITIAL_VALUE) && (g_arr[9] = arg2)) {


이렇듯 새로 추가된 8번 라인에 대한 새로운 위배가 검출되어 사용자에게 보고되어야 합니다.

그러나 단순히 라인 정보만을 이용하여 위배 무시를 유지하는 경우 이런 위배는 사용자의 확인 없이 무시됩니다.

저희 도구에서는 이러한 문제점을 막기 위해 위배무시 유지 시 사용자의 소스에 변경 여부를 확인합니다.





  • 소스 수정으로 인해 유효하지 않은 위배 무시를 유지하는 문제

마찬가지로 기존에 발생한 위배를 검토하고, 무시한 이후에 소스가 변경되었을 때, 해당 변경 내역 때문에 기존에 무시한 위배를 재검토해야 하는 경우가 있습니다.


void check_status(enum CD_PLAYER_STATUS status)
{
   switch (status) {
      case CD_RESUME :
         check_current_cd_player_status();
         /* MISRA_15_02 switch case가 break로 끝나지 않음 위배 발생 */ 
         /* 의도한 fall through, 위배 무시 처리함 */ 

      case CD_PLAY :
         play();
         break;

      defualt:
         /* do nothing */
         break;
   }
}

위의 코드에서는 CD_RESUME case 문에서 fall-through를 의도하고 구현했기 때문에 검출된 위배를 무시처리 했습니다.


void check_status(enum CD_PLAYER_STATUS status)
{
   switch (status) {
      case CD_PAUSE :
         /* pause 일 때도 resume일 때처럼 현재 상태 점검 */ 

      case CD_RESUME :
         check_current_cd_player_status();
         /* 기존 MISRA_15_02 위배 무시는 CD_PAUSE가 고려되지 않았음 */ 
         /* pause 일 때도 play()가 호출됨. 의도하지 않은 동작일 수 있음 */ 

      case CD_PLAY :
         play();
         break;

      defualt:
         /* do nothing */
         break;
   }
}


그러나 수정된 코드에서는 현재 상태가 CD_PAUSE 일 때에도 fall-trough 가 발생합니다.

이 경우 기존에 무시한 위배를 다시 검토해야 합니다.




이러한 경우 때문에 저희 도구에서는 UI에서 위배무시를 했을 때 사용자 소스에 변경이 있는 경우에는

기존의 위배무시에 대해 더 이상 무시를 유지하지 않습니다.