코드 마이그레이션

AIX 및 Linux용 Rational Developer는 다른 플랫폼에서 POWER 상의 AIX 또는 Linux로 마이그레이션할 때 발생할 수 있는 잠재적인 오류의 소스를 발견하기 위해 코드를 분석할 수 있는 정적 분석 도구를 제공합니다. 정적 분석 규칙 실행에 대한 자세한 정보는 정적 분석 규칙 실행을 참조하십시오.

다음은 다른 플랫폼에서 마이그레이션할 때 코드 실행에 대해 특히 유용한 정적 분석 도구 중 일부에 대한 간단한 개요입니다.

카테고리 규칙 목적
하드웨어 마이그레이션 문제      
  데이터 엔디언 문제 현재 하드웨어 아키텍처의 엔디언에 적합하지 않은 방식으로 한 데이터 구조에서 다른 데이터 구조로 전송 중인 코드를 발견합니다. char buffer[100];

// 이러한 명령문은 엔디언 문제가 발생할 수 있는 것으로 플래그 지정되어야 합니다.

int32_t myInt = buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3];

myInt = *((int *)buffer);
32비트에서 64비트로 마이그레이션할 때의 문제      
  32비트 시스템 기능에 대한 호출을 사용하지 마십시오. 32비트 시스템 기능에 대한 호출을 발견합니다. #include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>

int main() {
   int f;
   if ( f=open("data_file",O_RDWR) < -1)
      return -1;

   off_t offset = lseek32(f,LLONG_MAX,SEEK_CUR);
   return offset;
}
  특정 시스템 호출을 생성할 때 기타 정수 유형 외에 size_t를 사용해야 합니다. 함수/메소드의 반환 유형에서 지정하기 위해 size_t를 사용해야 하는 경우, 또는 매개변수를 전달할 때 정수 유형이 사용된 경우를 발견합니다. char c = strnlen(“hello”,LLONG_MAX);
  32비트 및 64비트 애플리케이션 간에 동작을 변경하는 문자열 형식의 지정자를 사용하는 방법은 권장하지 않습니다.  

printf("Hello %l",99); // “long”

printf("Hello %z",99); // “size_t”

printf("Hello %j",99); // “intmax_t”

printf("Hello %t",99); // “ptrdiff_t”

운영 체제 마이그레이션 문제      
  OS별 시스템 호출을 사용하지 마십시오. AIX 및 Linux 외의 운영 체제에만 해당되는 시스템 호출 사용을 발견합니다. processorid_t i, cpuid_max;

cpuid_max = sysconf(_SC_CPUID_MAX);

for (i = 0; i <= cpuid_max; i++) {

   // p_online() is a Solaris® operating system specific system call and will be flagged

   if (p_online(i, P_STATUS) != -1)
      printf("processor %d present\n", i);

}
  특정 버전의 AIX에서 POSIX 세마포어를 사용하지 마십시오. 특정 버전의 AIX에서 구현되지 않은 특정 POSIX 세마포어 호출 사용을 발견합니다. sem_t sem_name;

int* ip;


sem_init(&sem_name, 0, 10);

sem_wait(&sem_name);

sem_post(&sem_name);

sem_getvalue(&sem_name, ip);

sem_destroy(&sem_name);

  이동할 수 없는 상징 신호 값에 대한 참조를 사용하지 마십시오. AIX 또는 Linux에서 사용할 수 없는 이동할 수 없는 상징 신호 값에 대한 참조를 발견합니다. switch (sig) {

   case SIGEMT:

   case SIGLWP:

   case SIGWAITING:

   case SIG_FREEZE:

   case SIGTHAW:

   case SIGCANCEL:

   case SIGLOST:

   case SIGXRES:

      printf("Signal: %d\n",sig);

}
  신호 핸들러는 신호 수에 대해 기호 형식으로만 참조해야 합니다. 기호 이름 대신 신호 값에 대한 하드코딩된 숫자 상수를 사용하는 신호 핸들러를 발견합니다. 실제 신호 값은 운영 체제에 따다 다를 수 있습니다. void my_handler(int sig) {

   switch (sig) {

   case 0: // diagnostic.

       printf("0\n");
       break;

   }
}

int main() {

    struct sigaction action;

    action.sa_handler = my_handler

    return sigaction(99,&action,NULL);

}