Migración del código

Rational Developer for AIX and Linux proporciona herramientas de análisis estático que pueden analizar su código para buscar posibles fuentes de errores que pueden producirse al migrar a AIX o Linux on POWER desde otra plataforma. Para obtener más información sobre la ejecución de reglas de análisis estático, consulte la sección Ejecución de reglas de análisis estático.

A continuación se proporciona una visión general breve de algunas reglas de analísis estático cuya ejecución sobre el código puede ser particularmente útil al migrar desde otra plataforma

Categoría Regla Finalidad Ejemplos
Problemas de migración de hardware      
  Problemas de característica endian de datos Detecta código que puede estar transfiriendo datos de una estructura de datos a otra de forma inadecuada para la característica endian de la arquitectura de hardware actual. char buffer[100];

// estas sentencias se deben marcar como posibles problemas de endian

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

myInt = *((int *)buffer);
Problemas de migración de 32 bits a 64 bits      
  Se deben evitar las llamadas a funciones de sistema de 32 bits Detecta llamadas a funciones de sistema de 32 bits #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;
}
  Se debe utilizar size_t en lugar de otros tipos integrales al realizar determinadas llamadas del sistema Detecta la utilización de tipos integrales cuando se debe utilizar ze_t para asignar de un tipo de retorno de función/método o al pasar parámetros. char c = strnlen(“hello”,LLONG_MAX);
  No es recomendable utilizar especificadores de formato cambian el comportamiento entre aplicaciones de 32 bits y de 64 bits  

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

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

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

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

Problemas de migración de sistema operativo      
  Se deben evitar las llamadas de sistema específicas del sistema operativo Detecta la utilización de llamadas de sistema específicas de sistemas operativos que no sean AIX y Linux. processorid_t i, cpuid_max;

cpuid_max = sysconf(_SC_CPUID_MAX);

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

   // p_online() es una llamada de sistema específica del sistema operativo Solaris® y se marcará

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

}
  Se deben evitar los semáforos POSIX en determinadas versiones de AIX Detecta el uso de determinadas llamadas de semáforo POSIX que no están implementadas en determinadas versiones de AIX. 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);

  Se deben evitar las referencias a los valores de señal simbólicos no portables Detecta referencias a valores de símbolos simbólicos no portables que no están disponibles en AIX o 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);

}
  Los manejadores de señal solo deben hacer referencia simbólicamente a los números de señal Detecta casos en los manejadores de señal que utilizan constantes numéricas codificadas para valores de señal en lugar de nombres simbólicos. Los valores de señal reales varían entre algunos sistemas operativos. void my_handler(int sig) {

   switch (sig) {

   case 0: // diagnóstico.

       printf("0\n");
       break;

   }
}

int main() {

    struct sigaction action;

    action.sa_handler = my_handler

    return sigaction(99,&action,NULL);

}