Re: Text search segmentation fault
От | Gregory Stark |
---|---|
Тема | Re: Text search segmentation fault |
Дата | |
Msg-id | 87fxj2p04m.fsf@oxford.xeocode.com обсуждение исходный текст |
Ответ на | Re: Text search segmentation fault (Gregory Stark <stark@enterprisedb.com>) |
Ответы |
Re: Text search segmentation fault
|
Список | pgsql-general |
Gregory Stark <stark@enterprisedb.com> writes: > Teodor Sigaev <teodor@sigaev.ru> writes: > >> I reproduced the bug with a help of Grzegorz's point for 64-bit box. So, patch >> is attached and I'm going to commit it > ... > >> ! Conf->flagval[(unsigned int) *s] = (unsigned char) val; > ... >> ! Conf->flagval[*(unsigned char*) s] = (unsigned char) val; > > Maybe I'm missing something but I don't understand how this fixes the problem. Ah, I understand how this fixes the problem. You were casting to unsigned *int* not unsigned char so it was sign extending first and then overflowing. So char<255> was coming out as MAX_INT instead of 255. #include <stdio.h> main() { volatile signed char a = -1; printf("ud=%ud\n", (unsigned int)a); } $ ./a.out ud=4294967295d If you just make these all casts to (unsigned char) it should work just as well as the pointer type punning -- and be a whole lot less scary. > What really boggles me is why you don't just use unsigned chars everywhere and > remove all of these casts. or would that just move the casts to strcmp and > company? It still seems to me if you put a few "unsigned" in variable declarations you could remove piles upon piles of casts and make all of the code more readable. -- Gregory Stark EnterpriseDB http://www.enterprisedb.com Ask me about EnterpriseDB's 24x7 Postgres support!
В списке pgsql-general по дате отправления: