Code migrieren

Rational Developer for AIX and Linux stellt Tools für die statische Analyse bereit, mit denen Ihr Code analysiert werden kann, um potenzielle Quellen von Fehlern zu finden, die bei der Migration nach AIX oder Linux on POWER von einer anderen Plattform auftreten können. Weitere Informationen zur Ausführung von Regeln für die statische Analyse befinden sich in Regeln für statische Analyse ausführen.

Die folgende Kurzübersicht enthält einige Regeln für die statische Analyse, die besonders hilfreich sein können, wenn sie bei der Migration von einer anderen Plattform für Ihren Code ausgeführt werden.

Kategorie Regel Zweck Beispiele
Hardwaremigrationsprobleme      
  Daten-Endianness-Probleme Erkennt Code, der möglicherweise Daten aus einer Datenstruktur in eine andere Datenstruktur in einer Art und Weise überträgt, die für die Endianness der aktuellen Hardwarearchitektur falsch ist. char buffer[100];

// these statements should flag as possible endianness problems

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

myInt = *((int *)buffer);
Probleme bei der Migration von 32-Bit nach 64-Bit      
  Aufrufe für 32-Bit-Systemfunktionen sollten vermieden werden Erkennt Aufrufe für 32-Bit-Systemfunktionen #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;
}
  Bei bestimmten Systemaufrufen sollte size_t anstelle anderer Integraltypen verwendet werden Erkennt die Verwendung von Integraltypen, wobei size_t für die Zuordnung aus dem Rückgabetyp einer Funktion/Methode oder bei der Übergabe von Parametern verwendet werden sollte. char c = strnlen(“hello”,LLONG_MAX);
  Die Verwendung von Zeichenfolgeformatkennungen, die das Verhalten zwischen 32-Bit- und 64-Bit-Anwendungen ändern, wird nicht empfohlen  

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

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

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

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

Betriebssystemmigrationsprobleme      
  Betriebssystemspezifische Systemaufrufe sollten vermieden werden Erkennt die Verwendung von Systemaufrufen, die für andere Betriebssysteme als AIX und Linux bestimmt sind. 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);

}
  POSIX-Semaphore sollten bei bestimmten AIX-Versionen vermieden werden Erkennt die Verwendung von bestimmten POSIX-Semaphoraufrufen, die in bestimmten Versionen von AIX nicht implementiert sind. 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);

  Verweise auf nicht portierbare symbolische Signalwerte sollten vermieden werden Erkennt Verweise auf nicht portierbare symbolische Signalwerte, die unter AIX oder Linux nicht verfügbar sind. switch (sig) {

   case SIGEMT:

   case SIGLWP:

   case SIGWAITING:

   case SIG_FREEZE:

   case SIGTHAW:

   case SIGCANCEL:

   case SIGLOST:

   case SIGXRES:

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

}
  Signalhandler sollten nur symbolisch auf Signalzahlen verweisen Erkennt Fälle in Signalhandler, in denen fest codierte numerische Konstanten anstelle von symbolischen Namen für Signalwerte verwendet werden. Tatsächliche Signalwerte variieren zwischen einigen Betriebssystemen. 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);

}