Software safety-critical e ottimizzatori di compilatori

5

Sto leggendo alcuni documenti interni per codice sviluppato per le linee guida MISRA C , e lo vedo nei flag del compilatore sezione della documentazione c'è una nota da compilare con ottimizzazione off ( -O0 ). Sono nuovo nello sviluppo critico per la sicurezza, quindi nella mia mente la disattivazione dell'ottimizzazione è eccessivamente pessimistica e i compilatori moderni produrranno codice valido con ottimizzazione moderata, e comunque una suite di test decente catturerà i difetti del compilatore.

Ci sono buoni argomenti per disabilitare l'ottimizzazione? Forse a causa di questa disabilitazione, il codice è pieno di spostamenti a sinistra e a destra che sostituiscono divisioni e altre micro-ottimizzazioni che credo dovremmo lasciare al compilatore per affrontare.

    
posta Ken Y-N 24.12.2014 - 08:59
fonte

3 risposte

10

Sono d'accordo con te sul fatto che sia eccessivamente pessimista, ma alcuni (potenzialmente storici) motivi:

  • Il codice DO-178C livello A richiede Codice sorgente alla tracciabilità del codice oggetto , che è molto più difficile provare manualmente con codice ottimizzato (e i compilatori qualificati sono molto costosi)
  • il codice ottimizzato è più difficile da eseguire il debug, che potrebbe proibire le opportunità di debug scripted
  • potrebbe essere più bug del compilatore durante l'ottimizzazione
risposta data 24.12.2014 - 09:08
fonte
2

Se l'ottimizzatore per il tuo chipset / piattaforma non è noto per essere affidabile, devi chiederti quale sarebbe l'effetto collaterale del codice errato distribuito sul dispositivo incorporato:

  • Un Set Top Box potrebbe bloccarsi e richiedere all'utente di riavviarsi.

  • Un sistema di supporto vitale all'ospedale, potrebbe causare perdite di vite umane.

Mentre i test di sistema completi aiutano a cogliere scenari noti, sono gli scenari sconosciuti che probabilmente ti sorprenderanno.

Dato questo, sembra che ci possa essere qualche prematura ottimizzazione in corso nel codice di base - hai profilato il codice delle prestazioni per determinare che il codice con tutti gli operatori di turno è la causa principale dei problemi di prestazioni? Stai utilizzando il miglior algoritmo per il lavoro?

    
risposta data 24.12.2014 - 09:14
fonte
2

Non devi preoccuparti solo dei bug del compilatore. Alcune ottimizzazioni del compilatore "perfettamente valide" (cioè conformi alla lettera della lingua specifica) producono un comportamento abbastanza inaspettato. Vedi Individuazione dei bug di comportamento non definiti trovando il codice guasto .

The point is that these problems are real, and they’re nasty because the problem can only be seen by looking at the compiler’s output. Compilers are getting smarter all the time, causing code that previously worked to break. A sufficiently advanced compiler is indistinguishable from an adversary.

    
risposta data 24.12.2014 - 14:38
fonte

Leggi altre domande sui tag