2013-08-01 10 views
6

L'(accettato) proposal for "Runtime-sized arrays with automatic storage duration (N3639)" afferma cheQuanto è difficile il rilevamento a livello di sorgente degli array di limiti di runtime?

Stack Overflow diventa più probabile, in particolare se la dimensione dipende ingresso esterno e non è adeguatamente controllata. Alcuni ambienti potrebbero pertanto vietare l'uso della funzione. Tale divieto può essere facilmente applicato con uno strumento di analisi statico.

Non ritengo che l'esecuzione sia semplice se richiede all'analizzatore di implementare un compilatore C++ completo.

Si consideri il seguente codice:

template<typename T> 
inline void array_user(const T& x) 
{ 
    int a[f(traits<T>::omega)]; 
} 

Sembra a me come l'analisi deve essere ripetuta per ogni uso del array_user<T> e prendere in considerazione:

  • specializzazioni applicabili su traits<T> rilevabile presso il punto di uso di array_user<T>
  • Se traits<T>::omega è un'espressione costante in fase di compilazione (tramite constexpr o C++ 03 approcci come enum)
  • Il tipo di traits<T>::omega
  • Se il sovraccarico applicabile f() (al punto di utilizzo di array_user<T> e possibilmente trovati tramite ADL) è constexpr

mi sto perdendo qualcosa? È possibile applicare tale restrizione senza passare per la compilazione completa?

Il codice può essere scritto in modo tale da semplificare la verifica del mancato utilizzo dei limiti di esecuzione?

+1

Considerando che [N3652 rende quasi tutto legale nelle funzioni 'constexpr' in C++ 1y] (http://isocpp.org/files/papers/N3652.html), la scrittura di un analizzatore statico generale richiederà l'implementazione un interprete e un compilatore. – Casey

+0

@Casey: È garantito che ogni funzione 'constexpr' restituirà una costante in fase di compilazione se i suoi parametri sono costanti in fase di compilazione? Oppure può dipendere dalle specializzazioni di modelli consumati (eventualmente indirettamente) dalla funzione 'constexpr'? Mi sembra ancora che possa essere determinato tramite l'analisi del tipo, senza calcolare effettivamente il risultato della funzione 'constexpr' (e tutta l'esecuzione che comporta) –

+0

Non sono preoccupato per un analizzatore statico generale ai fini di questa domanda, solo uno per rilevare l'uso dei limiti di runtime. –

risposta

1

Se mi è stato assegnato il compito di scrivere un analizzatore per verificare in modo statico il non utilizzo dei limiti di runtime, rifiuterei il codice precedente. Vorrei che tutte le dichiarazioni dell'array usassero un letterale integrale per il limite o fossero annotate per fare in modo che il compilatore rifiutasse i limiti del runtime.

template<typename T> 
inline void array_user(const T& x) 
{ 
    int a[f(traits<T>::omega)]; 
    sizeof a; 
} 

Tuttavia, dato il numero di compilatori che attualmente forniscono in stile C99 VLA in modalità C++ come estensione, io non sono sicuro che avrebbero in realtà conforme al comportamento di C++ 14 di proibire sizeof.

+1

Clang/gcc consente 'decltype' per VLAs, e clang permette anche' typeinfo() '. Penso che la deduzione dei template sia l'unico modo per forzare facilmente i limiti statici che funziona nei compilatori di oggi ([example] (http://coliru.stacked-crooked.com/view?id=8f37bb9c196e4b0e360d60ead3e03eae-e1204655eaff68246b392dc70c5a32c9)). – Casey

Problemi correlati