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); } |
© Copyright IBM Corporation 2013. All Rights Reserved.