Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.os.linux.development > #35 > unrolled thread
| Started by | guido84 <guido84@invalid.invalid> |
|---|---|
| First post | 2017-06-04 08:15 +0000 |
| Last post | 2017-06-04 12:20 +0200 |
| Articles | 5 — 3 participants |
Back to article view | Back to it.comp.os.linux.development
Funzione strlen() guido84 <guido84@invalid.invalid> - 2017-06-04 08:15 +0000
Re: Funzione strlen() Giovanni <lsodgf0@home.net.it> - 2017-06-04 11:39 +0200
Re: Funzione strlen() Giovanni <lsodgf0@home.net.it> - 2017-06-04 11:41 +0200
Re: Funzione strlen() guido84 <guido84@invalid.invalid> - 2017-06-04 14:13 +0000
Re: Funzione strlen() Giuseppe Della Bianca <bepi.zac@zac.adria.it> - 2017-06-04 12:20 +0200
| From | guido84 <guido84@invalid.invalid> |
|---|---|
| Date | 2017-06-04 08:15 +0000 |
| Subject | Funzione strlen() |
| Message-ID | <oh0fj5$1adr$1@gioia.aioe.org> |
Adesso mi faccio tutte le funzioni, e' il modo piu' comodo e veloce
per capirci qualcosina del C.
====================== unsigned int strlen(char *srt) ===============
#include <stdio.h>
#include <string.h>
#define elle 81
int main(int argc, char** argv)
{
char a[elle];
if (argc==2)
{
sscanf(argv[1], "%s", a);
printf("\n%u\n\n", strlen(a));
}
if (argc==1)
{
printf("\nUsage: Conta i caratteri (max 80) immessi in argv[1] \n\n");
}
if (argc>=3)
{
printf("\nErrore: immettere solo in argv[1] \n\n");
}
return 0;
}
//$: gcc -Wall -O3 str-len.c -o str-len
===========================================
Il mio problema e' questo:
- Quando ho immesso piu' di 80 caratteri, ho provocato segfault.
- Ma come faccio a dirgli di uscire se son piu' di 80, quando e'
lei stessa (strlen) che deve contarli?!
Grazie in anticipo a chi en passant mi da' una dritta
--
Saluti,
Guido
[toc] | [next] | [standalone]
| From | Giovanni <lsodgf0@home.net.it> |
|---|---|
| Date | 2017-06-04 11:39 +0200 |
| Message-ID | <oh0kg2$3lj$1@milena.home.net.it> |
| In reply to | #35 |
On 06/04/2017 10:15 AM, guido84 wrote:
> Adesso mi faccio tutte le funzioni, e' il modo piu' comodo e veloce
> per capirci qualcosina del C.
>
> ====================== unsigned int strlen(char *srt) ===============
> #include <stdio.h>
> #include <string.h>
> #define elle 81
>
> int main(int argc, char** argv)
> {
> char a[elle];
>
> if (argc==2)
> {
> sscanf(argv[1], "%s", a);
> printf("\n%u\n\n", strlen(a));
> }
>
> if (argc==1)
> {
> printf("\nUsage: Conta i caratteri (max 80) immessi in argv[1] \n\n");
> }
>
> if (argc>=3)
> {
> printf("\nErrore: immettere solo in argv[1] \n\n");
> }
>
> return 0;
> }
>
> //$: gcc -Wall -O3 str-len.c -o str-len
> ===========================================
>
>
> Il mio problema e' questo:
> - Quando ho immesso piu' di 80 caratteri, ho provocato segfault.
> - Ma come faccio a dirgli di uscire se son piu' di 80, quando e'
> lei stessa (strlen) che deve contarli?!
>
>
> Grazie in anticipo a chi en passant mi da' una dritta
>
Fai il controllo del numero di caratteri prima della sscanf() !!!
Per esempio:
if (strlen(argv[1]) <= (elle -1)
{
sscanf(argv[1], "%s", a);
.......
}
Ciao
Giovanni
--
A computer is like an air conditioner,
it stops working when you open Windows.
< http://giovanni.homelinux.net/ >
[toc] | [prev] | [next] | [standalone]
| From | Giovanni <lsodgf0@home.net.it> |
|---|---|
| Date | 2017-06-04 11:41 +0200 |
| Message-ID | <oh0kp4$3lk$1@milena.home.net.it> |
| In reply to | #35 |
On 06/04/2017 10:15 AM, guido84 wrote:
> Adesso mi faccio tutte le funzioni, e' il modo piu' comodo e veloce
> per capirci qualcosina del C.
>
> ====================== unsigned int strlen(char *srt) ===============
> #include <stdio.h>
> #include <string.h>
> #define elle 81
>
> int main(int argc, char** argv)
> {
> char a[elle];
>
> if (argc==2)
> {
> sscanf(argv[1], "%s", a);
> printf("\n%u\n\n", strlen(a));
> }
>
> if (argc==1)
> {
> printf("\nUsage: Conta i caratteri (max 80) immessi in argv[1] \n\n");
> }
>
> if (argc>=3)
> {
> printf("\nErrore: immettere solo in argv[1] \n\n");
> }
>
> return 0;
> }
>
> //$: gcc -Wall -O3 str-len.c -o str-len
> ===========================================
>
>
> Il mio problema e' questo:
> - Quando ho immesso piu' di 80 caratteri, ho provocato segfault.
> - Ma come faccio a dirgli di uscire se son piu' di 80, quando e'
> lei stessa (strlen) che deve contarli?!
>
>
> Grazie in anticipo a chi en passant mi da' una dritta
>
Fai il controllo del numero di caratteri prima della sscanf() !!!
Per esempio:
if (strlen(argv[1]) <= (elle -1)
{
sscanf(argv[1], "%s", a);
.......
}
Ciao
Giovanni
--
A computer is like an air conditioner,
it stops working when you open Windows.
< http://giovanni.homelinux.net/ >
[toc] | [prev] | [next] | [standalone]
| From | guido84 <guido84@invalid.invalid> |
|---|---|
| Date | 2017-06-04 14:13 +0000 |
| Message-ID | <oh14ie$tul$1@gioia.aioe.org> |
| In reply to | #38 |
Il 4/6/2017 11:41:20 Giovanni scrisse:
>On 06/04/2017 10:15 AM, guido84 wrote:
>> Il mio problema e' questo:
>> - Quando ho immesso piu' di 80 caratteri, ho provocato segfault.
>> - Ma come faccio a dirgli di uscire se son piu' di 80, quando e'
>> lei stessa (strlen) che deve contarli?!
>Fai il controllo del numero di caratteri prima della sscanf() !!!
>Per esempio:
> if (strlen(argv[1]) <= (elle -1)
> {
> sscanf(argv[1], "%s", a);
> .......
> }
Gia', adesso mi sembra ovvio :-(
Ora va perfettamente! con la tua sintassi e i suggerimenti di
Giuseppe D.B. m'avete fatto capire l'inutilita' di caricare il
vettore a[] (che tra l'altro era lui che mi creava problemi).
Eccolo semplicissimo e grazie a entrambi!!
=================== unsigned int strlen(char *str) =============
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
unsigned int lunghezza;
if (argc==1) // argc == 1 -> NON si puo' contare una lunghezza infinita
{
printf("\nUsage: Conta i caratteri immessi in $1 \n\n");
}
else // argc > 1 -> adesso si puo' contare
{
lunghezza = strlen(argv[1]);
printf("%u\n", lunghezza);
}
return 0;
}
//$: gcc -Wall -O3 str-len.cc -o str-len
=======================================
--
Saluti,
Guido
[toc] | [prev] | [next] | [standalone]
| From | Giuseppe Della Bianca <bepi.zac@zac.adria.it> |
|---|---|
| Date | 2017-06-04 12:20 +0200 |
| Message-ID | <vf3d0e-feb.ln1@exnet.gdb.it> |
| In reply to | #35 |
guido84 wrote:
]zac[
> char a[elle];
>
> if (argc==2)
> {
> sscanf(argv[1], "%s", a);
> printf("\n%u\n\n", strlen(a));
]zac[
> Il mio problema e' questo:
> - Quando ho immesso piu' di 80 caratteri, ho provocato segfault.
> - Ma come faccio a dirgli di uscire se son piu' di 80, quando e'
> lei stessa (strlen) che deve contarli?!
]zac[
Il buffer overflow e' causato dalla funzione sscanf che scrive nella
variabile fino ad andare oltre la dimensione della stessa.
Il codice scritto dopo non puo' prevenire un problema che e' gia' avvenuto.
E' compito del programmatore scrivere il codice impedendo alle varie
funzioni di comportarsi scorrettamente.
P.S.
Non credi che dovresti provare a cercare su google sscanf + segfault o
sscanf + buffer overflow?
(Il miglior modo di imparare e' sfruttare le risorse e le esperienze
liberamente disponibili cercando di capire quale e' quella giusta).
[toc] | [prev] | [standalone]
Back to top | Article view | it.comp.os.linux.development
csiph-web