Path: csiph.com!aioe.org!.POSTED!not-for-mail From: guido84 Newsgroups: it.comp.os.linux.development Subject: Re: Spreco di memoria e minaccia alla sicurezza Date: Mon, 12 Jun 2017 14:57:49 +0000 (UTC) Organization: Aioe.org NNTP Server Lines: 96 Message-ID: References: NNTP-Posting-Host: wbddthcu++T7LiUtG2OuyQ.user.gioia.aioe.org X-Complaints-To: abuse@aioe.org X-Notice: Filtered by postfilter v. 0.8.2 Xref: csiph.com it.comp.os.linux.development:67 Il 12/6/2017 16:01:23 Alessandro Pellizzari scrisse: >On 12/06/17 13:11, guido84 wrote: >> Allora astutissimamente gli ho messo: >> char pippo[1]; >> adesso niente Warning e funzionamento sempre perfetto, anche con >> stringhe lunghissime. >Questo perche`, per efficienza, Linux alloca memoria in blocchi di >dimensione fissa (mi pare 4k), quindi finche` i tuoi dati stanno dentro >il blocco, e tu eccedi nell'ultima variabile dichiarata, va tutto bene. >Ma gia` se provi a fare >char pippo[1]; >char pluto[1]; >Scrivendo oltre il limite di pippo rischi di sovrascrivere pluto. TNX! questa me la faccio piu' tardi, voglio fargli sovrascrivere pluto (ma 4k sono veramente moltissmi, glieli daro' da file). >> allora dico: perche' mai nel libro che ho non fanno altro che >> scrivere in continuazione "char pippo[81];" ? >> Non sarebbe il caso di mettere SEMPRE "char pippo[1];" ? >No. Vedi sopra. >Il modo giusto e` usare malloc per allocare la memoria che ti serve, e >poi verificare di volta in volta che non la stai eccedendo. >A quel punto pippo diventa davvero un puntatore a un'area dinamica di >memoria, e lo puoi dichiarare con >char *pippo; Per imparare le funzioni e poi saperle usare, per atoi() ho cercato di poter dargli la stringa in input: 1. da argv[1], ormai facile: ./prova 111 2. col comando echo, unico modo: ./prova $(echo 111) 3. passandogliela con una pipe: echo 111 | ./prova - Per fare il 3 (tralasciando per il momento che non so fargli distinguere "-" da qualsiasi altro carattere diverso da cifre), non posso (mi sembra!) usare malloc, perche' scanf() non me lo puo' dire quanto e' lunga prima di riceverla. E per riceverla deve avere un posto-vettore dove metterla... insomma: il gatto che si mangia la coda. Percio' ho trovato l'escamotage di pippo[0] (adesso ho visto che prende anche lo zero). Ecco il codice. ------ #include #include int atoi(char *origine); char dapipe[0]; int main(int argc, char** argv) { int arg1, arg2; // ./prova (per l'help) if (argc == 1) { printf("\033[33mUsage: Stringa di arg1 in numero allo stdout \033[m \n"); } else { arg1 = atoi(argv[1]); // echo 123 | ./prova - if (arg1 == 0) { scanf("%s", dapipe); arg2 = atoi(dapipe); printf("%d\n", arg2); } // Caso ordinario else { printf("%d\n", arg1); } } return 0; } ---------------- -- Saluti, Guido