Architetture del processore per testare la portabilità C / C ++

5

Attualmente sto lavorando su una base di codice C / C ++ che è abbastanza portabile, può compilare sulla maggior parte dei sistemi Unix come MS-Windows (MSVC), usando vari compilatori popolari.

In precedenza ho trovato test su diversi sistemi operativi e architetture che possono aiutare a trovare bug oscuri o ipotesi errate.

Mi preoccupo per il dominio di x86 / amd64 che il nostro code-base potrebbe diventare inconsapevolmente meno portabile.

Oltre a testare su un sistema big-endian (per trovare errori ovvi con big / little endian), ci sono alcune architetture che hanno caratteristiche che le rendono migliori per la portabilità del software di stress testing?

Esempi di possibili differenze.

  • different endian.
  • comportamento diverso durante il threading.
  • comportamento della memoria dello stack.
  • dimensione dei tipi primitivi (char, short, int, long, float ... ecc.)
  • allineamento / riempimento di strutture (che potrebbe nascondere errori).
  • differenza di ottimizzazioni apportate dal compilatore.

Esistono architetture che presentano differenze più significative rispetto a x86 / amd64, rendendole migliori candidate per l'esposizione dei problemi di portabilità del codice? (e hanno compilatori e librerie C / C ++ - libc, libstdc ++).

Chiedere perché è un investimento di tempo considerevole per impostare un nuovo sistema, anche se emulato.

nel caso non sia chiaro cosa intendo per architetture di processori, ad esempio (x86, amd64, ia64, mips, risc, arm, m68k, ppc, itanium)

Nota, non sto proponendo questo come un modo principale per scoprire bug, eseguiamo più strumenti di analisi statica e test, ma in passato abbiamo rilevato errori nel codice a causa delle differenze nelle piattaforme meno comuni (SGI , SPARC, Solaris, BSD ecc. Tuttavia alcuni di questi sistemi stanno svanendo)

    
posta ideasman42 03.08.2014 - 09:33
fonte

2 risposte

6

Hai ragione che usare impostazioni diverse per i tuoi test può aumentare la possibilità di inciampare accidentalmente su alcuni bug. Tuttavia, dovresti considerare se impostare un altro banco di prova ha senso dal punto di vista commerciale delle cose - sospetto che tu voglia vendere o distribuire codice utile, piuttosto che creare il codice perfetto nella tua torre d'avorio.

I worry with the dominance of X86/AMD64 our code-base may unknowingly become less portable.

Se il tuo codice funziona sempre su architetture x86 o AMD64, allora c'è poco uso per testare su altre architetture - si applica YAGNI qui. Faresti meglio espandendo la tua suite di test per garantire tutto il comportamento documentato e eliminando il codice di base dei costrutti dubbi con l'aiuto dei linters. L'utilizzo di più compilatori diversi su diverse impostazioni è anche una strategia a basso costo e di grande impatto per la scoperta di bug (ad esempio GCC e Clang).

Se tuttavia supporti esplicitamente alcune combinazioni di architetture e sistemi operativi, dovresti anche testare quelle combinazioni.

Se tuttavia vuoi testare alcune configurazioni aliene ancora usate abbastanza comunemente, ti consiglio:

  • Architettura: SPARC. Sistemi operativi: famiglia Solaris, Linux, famiglia BSD. Endianness: grande, forse bi. Commenti: parallelismo massiccio.

  • Architettura: ARM. Sistemi operativi: Linux, famiglia BSD, OpenSolaris. Endianness: piccolo, forse bi. Commenti: utilizzati in dispositivi incorporati, telefoni cellulari.

Le funzionalità elencate possono essere testate variando i seguenti componenti nella configurazione:

  • Endianess: architecture.
  • Threading: sistema operativo, impostazioni del kernel, librerie di threading, numero di processori.
  • Stack:?
  • Dimensioni primitive: direttive del preprocessore, impostazioni del compilatore.
  • Struct alignment: compilatori.
  • Ottimizzazioni: impostazioni del compilatore
  • Altro: compila usando diverse implementazioni di libc.

La mia esposizione primaria alla programmazione multipiattaforma sta leggendo la fonte dell'interprete Perl. Qui i problemi di portabilità sono indicati da:

  • ... rilevando le funzionalità fornite dall'implementazione della libc utilizzata, eventualmente sostituendo le funzioni personalizzate. Questa informazione viene quindi registrata come un insieme di definizioni del preprocessore prima della compilazione.
  • ... utilizza in modo pervasivo macro per tipi numerici. Le dimensioni possono essere impostate durante la compilazione.
  • ... rendendo la filettatura opzionale, poiché la versione non filata ha prestazioni migliori. Nel codice, alcune sezioni vengono eseguite solo se compilate con il supporto per il threading.
  • ... per lo più ignorando l'endianess, poiché questo tende a risolversi. Endianness diventa rilevante solo quando si fa qualcosa come interpretare un dato pattern di bit come un numero BE a 16 bit su un sistema LE.
  • ... elenca in modo esplicito le piattaforme supportate e documenta anche problemi di portabilità o comportamenti diversi su queste piattaforme.
  • ... eseguendo un'enorme suite di test incl. una tonnellata di test di regressione eseguiti su una rete di caselle CI.
risposta data 03.08.2014 - 11:40
fonte
4

Penso che probabilmente ne hai già parlato molto, ma vorrei dare qualche ulteriore considerazione a:

  • Ambiente con poca memoria, ad es. mobile con RAM piccola o dispositivi incorporati. Anche se i tuoi attuali clienti potrebbero non aver bisogno di questo, chissà se la tua biblioteca è improvvisamente molto richiesta per i sistemi di gestione del motore o per i router domestici.
  • Ambiente altamente concorrenziale, ad es. più thread e core di quanti tu abbia mai considerato possibile. Sebbene sia possibile avere percorsi di codice a thread singolo e multi-thread come opzione di compilazione, è possibile che un numero elevato di thread possa mettere in luce contese che non sapevi di avere.
  • Posso fornire i miei allocatori? In caso contrario, cosa succede se ridefinisco malloc o operator new () per utilizzare un allocatore di slab o un meccanismo di memoria altrimenti non standard - il tuo codice può ancora farcela?
  • Stai facendo affidamento sull'ordine di inizializzazione da qualche parte? Qualsiasi variabile allocata staticamente?
risposta data 03.08.2014 - 21:42
fonte

Leggi altre domande sui tag