Newsgroup: it.comp.os.linux.development
Titolo: readline

Vorrei un informazione, sto sviluppando un applicazione che fa uso della
libreria libreadline, solamente che dopo aver chiamato un pò di volte
questa funzione (readline()) va in segmentation fault sono sicuro che è la
funzione perchè crasha mentre sto scrivendo, ho cercato sul sito tra i bug
ma sembra non risultare, la mia versione della libreadline è 4.3-4mdk (e si
uso la versione mdk ma fa lo stesso anche su rh), c'e qualcunaltro che la
usata e ha avuto lo stesso problema risolvendolo....
Ringrazio tanto....
-- 
E-Mail: 
risi...@libero.it
Sito Web: 
digilander.libero.it/risitano
N2 Paint project (paint base per svgalib)

 Ringrazio tanto....
Non l'ho mai usata, però posso dirti una cosa di cui sono certo: il fatto
che crashi mentre il programma sta eseguendo funzioni di quella libreria
non vuol dire affatto che l'errore sia nella libreria stessa. Se non sei
un programmatore esperto prima di cercare un bug in una libreria dovresti
ricontrollare piu volte il tuo elaborato; se posti il codice magari ti
aiutiamo (a patto che non sia eccessivamente lungo)
Ciao.
Matic

Questa è la funzione in cui chiamo readline:
prompt è una stringa settata cosi' nel main:
char prompt[80] = "\e[1;32m[";
strcat (prompt, login);
strcat (prompt, "@");
strcat (prompt, date);
strcat (prompt, "]# \e[00m");
.
.
.
char *
getcomando (char *prompt)
{
  char *comando = NULL;
  comando = readline (prompt); ----> crasha qui...(Segmentation fault)
  if (comando && *comando)
    add_history (comando);
  return comando;
}
Il resto del codice l'ho metterò sulla mia pagina WEB (Vedere sotto) al +
presto...
Ringrazio chiunque voglia aiutarmi...


   if (comando && *comando)
scusa, non capisco questo controllo
perché un AND con un puntatore ed il suo contenuto?
scusa, passi il prompt[] della main() a getcomando?
credo che il problema sia qui: getcomando() vuole un char*, tu gli passi
un char[].
boh, poi potrei aver detto una fesseria immane, eh.
-- 
Andrea Spadaccini a.k.a. [Deja-vu] Lupino
               - Catania -
Now playing: Queen - A Kind Of Magic

 Ringrazio chiunque voglia aiutarmi...
sei sicuro che ti crashi proprio dentro readline ? Hai provato con un
debugger ?
l'uso di questa istruzione è scorretta, e di certo non è quello che
volevi:
if (comando && *comando)
se comando = NULL (ed è previsto che readline possa ritornare NULL)
questo statement ti darà segmentation fault (non puoi leggere *comando:
l'indirizzo 0x00000000 non fa parte del tuo programma ). Immagino che tu
volessi fare 'if( comando )'
magari è questo l'errore che incontri; se sei proprio sicuro che sia
readline a crashare forse dovresti controllare in altre parti del tuo
programma dove fai uso di malloc/calloc/realloc.
Ho letto sulla manpage che readline usa malloc per restituire la stringa
(ricordati di usare free poi). Quando avviene un overflow su una stringa
mallocata, vengono sovrascritte strutture su cui malloc stessa si basa:
magari l'overflow non fa crashare subito il programma, ma la successiva
chiamata a malloc lo farà.
Quello che voglio dire è che magari tu hai usato malloc, hai scritto su
questa area allocata piu dati di quanti ne poteva contenere, e il
segmentation fault viene fuori solo alla chiamata a malloc() di readline
Si ok, mi son spiegato di m*rd* :) però spero d'averti chiarito un po' le
idee..
Ciao
Matic

 boh, poi potrei aver detto una fesseria immane, eh.
si in effetti :)
se tu dichiari
char foo[20];
il compilatore sostituisce ogni occorrenza di foo con il puntatore al
suo primo carattere, cioè lo sostituisce con &foo[0], che a tutti gli
effetti è un char*
Ciao
Matic

 effetti è un char*
Giustissimo! <8-)
/me idiota.
/me torna nel suo angolino


Io if(comand && *comand) l'ho presa dal sito ufficiale della readline,in un
esempio, comunque a rigor di logica in una if se c'è la AND lui controlla
il primo paramentro se questo è falso il secondo non dovrebbe essere
nemmeno preso in considerazione (nella AND basta una falsa per invalidare
il tutto) però potrebbe essere colpa della malloc interna della readline,
devo controllare bene...
l'ho monitorata con strace è l'output è:
---------------------solo le ultime righe-------------------
write(1, ".freeciv                       ."..., 71) = 71
write(1, ".fullcircle                    ."..., 73) = 73
write(1, ".gaim                          ."..., 70) = 70
write(1, ".gaimrc                        ."..., 66) = 66
write(1, ".gconf                         ."..., 65) = 65
write(1, "\33[1;32m[root@Sun Jun 15 02:24:56"..., 61) = 61
ioctl(0, TIOCGWINSZ, {ws_row=42, ws_col=111, ws_xpixel=0, ws_ypixel=0}) = 0
write(1, "\r\33[K\33[1;32m[root@Sun Jun 15 02:2"..., 65) = 65
rt_sigprocmask(SIG_BLOCK, NULL, [RTMIN], 8) = 0
read(0, "z", 1)                         = 1
write(1, "z", 1)                        = 1
ioctl(0, TIOCGWINSZ, {ws_row=42, ws_col=111, ws_xpixel=0, ws_ypixel=0}) = 0
write(1, "\r\33[K\33[1;32m[root@Sun Jun 15 02:2"..., 66) = 66
rt_sigprocmask(SIG_BLOCK, NULL, [RTMIN], 8) = 0
read(0, "\t", 1)                        = 1
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|0600, st_size=4096, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
---------------------------------------------------
sono sicuro che è la readline... adesso il codice completo è sul
sito...(guardare sotto) controllerò malloc in + e free in meno... forse e
propio questo il problema..



Questo non e' vero. Il c cortocircuita il controllo delle condizioni.
Se comando e' nullo NON viene controllato *comando, in questo caso.
Quindi e' giusto cosi' com'e'.
Ciao,
Ema

 perché un AND con un puntatore ed il suo contenuto?
Dovrebbe controllare che:
(1) il puntatore "comando" non sia nullo, ovvero che la funz. readline non
abbia restituito NULL;
(2) il primo carattere della stringa "*comando" non sia '\0', ovvero che la
stringa non sia vuota.
Non fa una grinza. Secondo me e' OK!
Ciao,
Ema

 Ema
Giustissimo.
non c'avevo proprio pensato :P
Cieo
Matic

 Non fa una grinza. Secondo me e' OK!
Infatti io ho chiesto cosa fa, mica ho detto che è sbagliato..
semplicemente non avevo capito! :)
-- 
Andrea Spadaccini a.k.a. [Deja-vu] Lupino
               - Catania -
Now playing: Elio E Le Storie Tese - Servi Della Gleba

  comando = readline (prompt); ----> crasha qui...(Segmentation fault)
per il resto, io ho provato sulla mia debian 3.0 stable e non va in
crash.
-- 
There are only 10 kinds of people in the world --
Those who understand binary, and those who don't.

 
Curiosità: Qual è la versione delle readline che hai installate, potrebbe
essere quello il mio problema.... perchè come ho gia postato ho fatto il
trace dell'applicazione e crasha sempre dopo questa syscall:
---------------------solo le ultime righe-------------------
write(1, ".freeciv                       ."..., 71) = 71
write(1, ".fullcircle                    ."..., 73) = 73
write(1, ".gaim                          ."..., 70) = 70
write(1, ".gaimrc                        ."..., 66) = 66
write(1, ".gconf                         ."..., 65) = 65
write(1, "\33[1;32m[root@Sun Jun 15 02:24:56"..., 61) = 61
ioctl(0, TIOCGWINSZ, {ws_row=42, ws_col=111, ws_xpixel=0, ws_ypixel=0}) = 0
write(1, "\r\33[K\33[1;32m[root@Sun Jun 15 02:2"..., 65) = 65
rt_sigprocmask(SIG_BLOCK, NULL, [RTMIN], 8) = 0
read(0, "z", 1)                         = 1
write(1, "z", 1)                        = 1
ioctl(0, TIOCGWINSZ, {ws_row=42, ws_col=111, ws_xpixel=0, ws_ypixel=0}) = 0
write(1, "\r\33[K\33[1;32m[root@Sun Jun 15 02:2"..., 66) = 66
rt_sigprocmask(SIG_BLOCK, NULL, [RTMIN], 8) = 0
read(0, "\t", 1)                        = 1
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|0600, st_size=4096, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0     <----Syscall incriminata
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
ho fatto varie prove ed è sempre qui l'errore
Non capisco perchè lo fa, potrebbe anche essere come dici tu (il limite
degli 80 Char) ora vedo....
Grazie....
-- 
E-Mail: 
risi...@libero.it
Sito Web: 
digilander.libero.it/risitano
Supporta anche tu gli USA in IRAQ

 +++ killed by SIGSEGV +++
quindi va in segfault quando premi tab per avere la lista dei file
come nella shell...  fa una open della directory corrente, ci lavora
un po' sopra e poi crasha.
Vediamo sulla mia debian:
[...]
read(0, "\t", 1)                        = 1
open("/dev/null", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = -1 ENOTDIR (Not a directory)
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|S_ISVTX|0777, st_size=12288, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
brk(0x8057000)                          = 0x8057000
getdents64(0x3, 0x8054918, 0x1000, 0x19) = 352
getdents64(0x3, 0x8054918, 0x1000, 0x19) = 0
close(3)                                = 0
[...]
No, tutto a posto! Funziona correttamente. Sembra che da te vada in
crash quando fa la brk (e' un'espansione dello heap, probabilmente
dovuto ad una malloc())... e' davvero strano che dia un sigfault
proprio li'... prova comunque ad aggiornare la libreria e vedi se il
problema sparisce.


Nicolò Risitano scrive :
Proverò Gazie...
