Le funzioni dovrebbero essere preparate per i buffer sovrapposti?

0

Quindi ho una funzione in C come questa:

void crunch(const char *in, char *out, size_t inLen, size_t outLen)
{
    //...
}

Se i due buffer si sovrappongono, la funzione potrebbe rovinare anche il buffer di input durante la generazione dell'output.

  • Qual è la pratica generale?
  • Devo sempre considerare i buffer sovrapposti durante l'implementazione di funzioni come questa?
  • Dovrei assumere che l'utente non superi i buffer sovrapposti?
  • Devo sempre documentare se la funzione funziona bene o no con i buffer sovrapposti?
posta Calmarius 10.02.2014 - 14:06
fonte

2 risposte

3

Dipende interamente dalla filosofia del tuo componente software.

Specialmente nel mondo C, è considerato perfettamente normale produrre un comportamento non definito su precondizioni violate, se ciò rende l'implementazione più semplice. In altri contesti, i tuoi utenti e altri implementatori potrebbero trovarlo completamente inaccettabile e richiederebbe un comportamento solido verificando i limiti specificati e eseguendo una copia interna, se necessario.

L'unica cosa su cui tutti i professionisti dovrebbero essere d'accordo è che devi dichiarare esplicitamente cosa succede quando gli input si sovrappongono, anche se l'effetto non è definito.

    
risposta data 10.02.2014 - 14:10
fonte
0

In primo luogo, il metodo deve dichiarare un contratto. Un contratto dice: se fai X, farò Y. Vedi link .

Deve (a) richiedere i buffer non sovrapposti come pre-condizione o (b) consentire i buffer sovrapposti.

Nel caso (a), il contratto dovrebbe essere applicato per almeno una parte del ciclo di vita di sviluppo / test. Cioè, dovresti aggiungere del codice alla funzione che verifica i buffer non sovrapposti e asserisce (fallisce) se non è soddisfatto. Poiché questo codice probabilmente ha vincoli prestazionali, probabilmente vorrai essere in grado di attivare il test per lo sviluppo e il testing e disattivarlo per la produzione, ma questa è una scelta che fai.

nel caso (b), si aggiunge codice per consentire i buffer sovrapposti. Potrebbe essere un algoritmo diverso, forse più lento o qualsiasi altra tecnica tu scelga.

  • Quello che descrivo è la migliore pratica. Non ho modo di sapere se lo è pratica generale.
  • Devi considerare i buffer sovrapposti.
  • Non dovresti assumere nulla oltre al tuo contratto.
  • Il contratto fornisce la documentazione.
risposta data 10.02.2014 - 14:38
fonte

Leggi altre domande sui tag