Può questa funzione è più sicuro? Cerchi consigli ei vostri pensieri!

StackOverflow https://stackoverflow.com/questions/1077479

  •  21-08-2019
  •  | 
  •  

Domanda

questo è in qualche modo di una domanda strana.

ho scritto una funzione C. Il suo 'come' strchr / strrchr. Si suppone che cercare un carattere in una c-string, ma andando a ritroso, e tornare un puntatore ad esso. Come stringhe C non sono "null iniziati", ci vuole anche un terzo parametro 'count', che indica il numero di caratteri si deve guardare indietro.

/*
*s: Position from where to start looking for the desired character.
*c: Character to look for.
*count: Amount of tests to be done
*
* Returns NULL if c is not in (s-count,s)
* Returns a pointer to the occurrence of c in s.
*/
char* b_strchr(const char* s,int c,size_t count){

    while (count-->0){

        if (*s==c) return s;
        s--;
     }
     return NULL;
}

Ho fatto alcuni testing su di esso, ma Vedete eventuali difetti in esso? Le questioni di sicurezza o giù di lì? Eventuali miglioramenti? Potrebbe essere migliorato? E più importante:? Si tratta di una cattiva idea

Alcuni utilizzo.

    char* string = "1234567890";

    printf("c: %c\n",*b_strchr(string+9,'5',10));//prints 5

    printf("c: %c\n",*b_strchr(string+6,'1',7));//prints 1

EDIT: Nuova interfaccia, alcune modifiche

.
/*
* from:  Pointer to character where to start going back.
* begin: Pointer to characther where search will end.
*
* Returns NULL if c is not between [begin,from]
* Otherwise, returns pointer to c.
*/
char* b_strchr(const char* begin,int c,const char* from){


    while (begin<=from){

        if (*from==c) return from;
        from--;
     }
     return NULL;
}
È stato utile?

Soluzione

E 'meglio con la modifica, ma l'interfaccia è ancora sorprendente. Avevo messo il begin parametro (il pagliaio da ricercare) come primo parametro, il parametro di c ( ago ricercata) secondo, e il from parametri (posizione di partenza della ricerca) terzo. Che fine sembra essere idiomatica in una abbastanza grande set di API.

Altri suggerimenti

Il codice ha un'interfaccia esoterica - passare un puntatore l'ultimo carattere della stringa e la lunghezza della stringa. Che porterà a problemi di utilizzarlo.

(In alternativa, il codice ha un bug - si dovrebbe aggiungere al conteggio s prima del ciclo).

Se inizio è da, il codice corrente tornerà sempre cominciare, che non è quello che si vuole. Il codice dopo il ciclo può essere solo NULL ritorno. E invece di cominciare! = Da nella condizione del ciclo, vorrei utilizzare iniziare

Modifica: Il secondo pensiero dal momento che si desidera [iniziare, dal] inclusiva dovrebbe essere iniziare <= da

  

ho scritto una funzione C. Il suo 'come' strchr / strrchr.

Hai tentato di reinventare strrchr(), quindi non è come strchr().

  

Non si vede eventuali difetti in esso?

Sì. Parecchi. : - (

Dal b_strchr() può tornare NULL, non si deve metterlo direttamente nel printf() dichiarazione. Deferencing s solito si traduce in un segfault.

Si può essere meglio con la vostra variante preferita di ...

char *result;

result = b_strchr(string + 9, 'a', 10));
if (result == NULL)
{
    printf("c: NULL\n");
}
else
{
    printf("c: %c\n", *result);
}

Inoltre, quando

(count >= length of the input string) and the character is not found

si sta andando ad ottenere risultati unpredicable perché <=> è più che punta a un carattere della stringa - <=> sta puntando alla memoria prima dell'inizio della stringa. A titolo di esempio, provare

result = b_strchr(string + 9, 'a', 11));
if (result == NULL)
{
    printf("c: NULL\n");
}
else
{
    printf("c: %c\n", *result);
}

e vedere cosa succede.

Espandi i tuoi casi di test utilizzare per includere le condizioni al di fuori di ciò che si sa sarà lavorare con successo. Chiedere a qualcun altro per aiutarvi a progettare casi di test in grado davvero di provare il codice.

  

E più importante: Si tratta di una cattiva idea

?

Come un esercizio di apprendimento, assolutamente no.

Tuttavia, in questo caso, per il codice di produzione si sarebbe meglio attenersi allo standard <=>.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top