
Moderatore: Staff



j0kers ha scritto:Certo però si aggiunge comunque altro codice e altre variabili.
comunque ci sono milioni di soluzioni per giungere alla medesima soluzione.
Dipende poi dal programmatore


j0kers ha scritto:Oppure
- Codice: Seleziona tutto
if( (fp=fopen("proc","r"))==NULL)
exit(fprintf(stderr, "Errore apertura file!\n"));
Giusto ?
if(! (fp = fopen("proc","r")))
exit(fprintf(stderr, "Errore apertura file!\n"));

Mario Vanoni ha scritto:...gli exit code possono servire per individuare il posto del fallimento,
con un programma semplice pero` basta zero o non zero,
soprattutto se il messaggio d'errore e` molto chiaro!
...
if [ ! -r /etc/fastboot ]; then
/sbin/fsck $FORCEFSCK -C -a /
RETVAL=$?
fi
if [ $RETVAL -ge 2 ]; then
if [ $RETVAL -ge 4 ]; then
echo "*** An error occurred during the root filesystem check. ***"
...
else # With an error code of 2 or 3, reboot the machine automatically:
...
Mario Vanoni ha scritto:j0kers ha scritto:Oppure
- Codice: Seleziona tutto
if( (fp=fopen("proc","r"))==NULL)
exit(fprintf(stderr, "Errore apertura file!\n"));
Giusto ?
Ancora piu` short:
- Codice: Seleziona tutto
if(! (fp = fopen("proc","r")))
exit(fprintf(stderr, "Errore apertura file!\n"));


masalapianta ha scritto::fuori:![]()
![]()
![]()
![]()
a parte gli orrori che ti han gia fatto notare, in una manciata di righe di codice abbiamo, non uno, ma ben due overflow sullo stack, dipendenti dalla dimensione di argv[1] e di quello che c'è nel file "proc", se hai a che fare con stringhe di cui non conosci a priori la lunghezza valuta la possibilità di allocare dinamicamente con malloc e socie, oppure se vuoi porre a priori un limite assicurati di controllare quanta roba scrivi ed eventualmente gestisci l'eccezione (anzichè troncare la stringa e proseguire come nulla fosse); usi una variabile di appoggio "lettura_file" non si capisce per quale motivo (porcata per porcata a sto punto anzichè fare strncpy dal buffer della fgets a lettura_file e poi strcat da lettura_file a comando a sto punto fai direttamente strncat dal buffer della fgets a comando); evita i commenti con //, non sono ansi/c89; includi stdlib.h senza motivo.
Apro una parentesi sulla programmazione pseudo-sicura: non usate MAI roba come strcat e compagnia cantante se non avete la certezza che sia stato fatto un controllo a monte; per la manipolazione delle stringhe esistono alternative sicure come le strl* bsd, l'approccio bernsteiniano con alloc/stralloc, ecc..
Tornando a te, è evidente che stai cominciando a programmare senza alcun metodo, verosilmilmente hai letto qualche pagina di un tutorial e ti sei buttato a scriver codice senza aver prima acquisito le nozioni che quel codice richiede per essere scritto; con linguaggi ad alto livello (perl, php, ecc..), questo tipo di approccio, seppure porti a risultati mediocri, può essere intrapreso, con il C no; procurati un buon libro (consiglio Deitel&Deitel e K&R, il primo è più didattico ma molto dispersivo, il secondo è meno dispersivo ma meno didattico) e inizia a studiare, scrivi tanto codice, ma scrivilo di pari passo con la teoria studiata.
Riguardo il vanoniano exit, usando come codice d'uscita l'int tornato dalla fprintf, stendo un velo pietoso, per ottimi motivi esistono metodi standard (vedi post di gallows) per la gestione degli errori e per l'uso di particolari exit code in caso di errore.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *fp;
char *cmd;
char *buffer;
int buff_size=128;
if((fp=fopen("proc","r"))==NULL)
exit(fprintf(stderr, "Open file error!\n"));
if( (cmd=malloc(buff_size))==NULL || (buffer=malloc(buff_size))==NULL)
exit(fprintf(stderr,"Error allocate %s or %s into memory!\n",cmd,buffer));
if(argc==2){
strcpy(cmd,"/bin/ps ");
strcat(cmd,argv[1]);
strcat(cmd," | grep -v");
}else
strcpy(cmd,"/bin/ps | grep -v");
while(fgets(buffer,buff_size,fp)){
if ((cmd = realloc(cmd, buff_size *= 2)) == NULL)
exit(fprintf(stderr,"Error allocate %s into memory!\n",cmd));
strcat(cmd," -e ");
strncat(cmd,buffer,strlen(buffer)-1);
}
system(cmd);
return 0;
}


Errori di svista purtroppo 

while(fgets(buffer,buff_size,fp)if ((cmd = realloc(cmd, buff_size *= 2)) == NULL)strncat(cmd,buffer,strlen(buffer)-1);


Visitano il forum: Nessuno e 1 ospite