🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

7 total messages Started by Karol Wojtiuk Thu, 13 Nov 1997 19:46
Uwaga: blad w funkcji isdigit .
#288
Author: Karol Wojtiuk
Date: Thu, 13 Nov 1997 19:46
29 lines
1781 bytes
Witam wszystkich
funkcja isdigit jest zadeklarowana następująco:
int isdigit(int c);
i ma ona za zadanie sprawdzać czy dane c jest znakiem z przedzialu '0' -
'9'.
Nie wiem jak wyglądają implementacje w innych bibliotekach ale w
dostarczanej
przez Microsoft isdigit operuje na tablicy _ctype[257]. Jak widać z rozmiaru
tablicy
można sprawdzić tylko 257 wartości i jeżeli zmienna c przyjmie wartość
ujemną (co
może być bardzo częste gdy używamy jako parametru wartości typu char ze
znakiem)
lub przyjmie wartość powyżej 256 to program nam się wywala.
Rozumiem, że ze względu na dużą szybkość przyjęto taki sposób implementacji
ale
po pierwsze należało sporządzić inną deklarację funkcji (parametr typu int
mówi wyraźnie,
że możemy używać wartości parametru w o wiele większym zakresie niż tylko od
0 do 256) i
po drugie można było zaznaczyć w opisie funkcji, że akceptuje ona tylko
wartości od 0 do 256.
Co o tym sądzicie?
A może ja jestem w błędzie?
Czy zauważyliście inne kwiatki?
Pozdrowienia
Karol Wojtiuk
PS. Powyższe prawdopodobnie tyczy się wszystkich funkcji is..., ale jeszcze
tego nie sprawdzałem.
Re: Uwaga: blad w funkcji isdigit .
#289
Author: Jacek Czerwinski
Date: Fri, 14 Nov 1997 06:17
37 lines
2187 bytes
Karol Wojtiuk wrote:
Chyba masz racje, w borlandzie o ile pamietam jest najpierw filtrowana
na zakres, a moze tylko w wersji z mocniejszym deguggiem ?
Moze nie w borlandzie, ale gdzies widzialem ....
Albo makra, ktore pomyslane sa dla liczb dodatnich, a daje ktos znak >
128, a znak jest signed ...

> 
> Witam wszystkich
> funkcja isdigit jest zadeklarowana następująco:
> int isdigit(int c);
> i ma ona za zadanie sprawdzać czy dane c jest znakiem z przedzialu '0' -
> '9'.
> Nie wiem jak wyglądają implementacje w innych bibliotekach ale w
> dostarczanej
> przez Microsoft isdigit operuje na tablicy _ctype[257]. Jak widać z rozmiaru
> tablicy
> można sprawdzić tylko 257 wartości i jeżeli zmienna c przyjmie wartość
> ujemną (co
> może być bardzo częste gdy używamy jako parametru wartości typu char ze
> znakiem)
> lub przyjmie wartość powyżej 256 to program nam się wywala.
> Rozumiem, że ze względu na dużą szybkość przyjęto taki sposób implementacji
> ale
> po pierwsze należało sporządzić inną deklarację funkcji (parametr typu int
> mówi wyraźnie,
> że możemy używać wartości parametru w o wiele większym zakresie niż tylko od
> 0 do 256) i
> po drugie można było zaznaczyć w opisie funkcji, że akceptuje ona tylko
> wartości od 0 do 256.
> Co o tym sądzicie?
> A może ja jestem w błędzie?
> Czy zauważyliście inne kwiatki?
> Pozdrowienia
> Karol Wojtiuk
> PS. Powyższe prawdopodobnie tyczy się wszystkich funkcji is..., ale jeszcze
> tego nie sprawdzałem.
Re: Uwaga: blad w funkcji isdigit .
#290
Author: Marek Kotowski
Date: Fri, 14 Nov 1997 09:05
22 lines
1392 bytes
Karol Wojtiuk wrote:

> funkcja isdigit jest zadeklarowana nastêpuj±co:
> int isdigit(int c);
[...]
> po pierwsze nale¿a³o sporz±dziæ inn± deklaracjê funkcji (parametr typu int
> mówi wyra¼nie,
> ¿e mo¿emy u¿ywaæ warto¶ci parametru w o wiele wiêkszym zakresie ni¿ tylko od
> 0 do 256) i
> po drugie mo¿na by³o zaznaczyæ w opisie funkcji, ¿e akceptuje ona tylko
> warto¶ci od 0 do 256.
> Co o tym s±dzicie?

  Zgodnie z "Rationale" funkcja (makro) isdigit oraz inne standardowe
funkcje
zadeklarowane w ctype.h maja jako argument int po to, by oprocz malych
wartosci znakowych (unsigned char) moc obsluzyc takze znak EOF, ktory
tradycyjnie ma wartosc -1 lub inna ujemna. Z tej samej przyczyny takie
funkcje jak getchar zwracaja nie char ale int. Zatem bledu w isdigit nie
ma.
   
  Marek Kotowski
Re: Uwaga: blad w funkcji isdigit .
#291
Author: Karol Wojtiuk
Date: Fri, 14 Nov 1997 10:25
51 lines
2616 bytes
Marek Kotowski wrote in message <346C146D.4F69@imm.org.pl>...
>Karol Wojtiuk wrote:
>
>> funkcja isdigit jest zadeklarowana następująco:
>> int isdigit(int c);
>[...]
>> po pierwsze należało sporządzić inną deklarację funkcji (parametr typu
int
>> mówi wyraźnie,
>> że możemy używać wartości parametru w o wiele większym zakresie niż tylko
od
>> 0 do 256) i
>> po drugie można było zaznaczyć w opisie funkcji, że akceptuje ona tylko
>> wartości od 0 do 256.
>> Co o tym sądzicie?
>
>  Zgodnie z "Rationale" funkcja (makro) isdigit oraz inne standardowe
>funkcje
>zadeklarowane w ctype.h maja jako argument int po to, by oprocz malych
>wartosci znakowych (unsigned char) moc obsluzyc takze znak EOF, ktory
>tradycyjnie ma wartosc -1 lub inna ujemna. Z tej samej przyczyny takie
>funkcje jak getchar zwracaja nie char ale int. Zatem bledu w isdigit nie
>ma.
>
>  Marek Kotowski

Blad w isdigit jest poniewaz w opisie tej funkcji jak i w header'ach
bibliotek nie jest zaznaczone, ze mozna operowac tylko na wartosciach od -1
do 255, a deklaracja funkcji mowi jasno o dopuszczalnosci argumentu z
zakresu int. Dodatkowo trzeba zaznaczyc, ze powoduje to trudno wykrywalny
blad jezeli operuje sie na wartosciach signed char (po prostu nie
przypuszczasz ze wywali ci program na znaku funta angielskiego). Dodatkowo
jako dowod moze tu posluzyc koncowka implementacji tablicy _ctype z pliku
ctype.c:
...
        _PUNCT,                 /* 7E ~     */
        _CONTROL,               /* 7F (DEL) */
        /* and the rest are 0... */
};
Chodzi mi o zdanie "and the rest are 0", ktore jest nieprawda.

Na koniec warto dodac, ze to wszystko dotyczy tylko funkcji bibliotecznych
Microsoft.
Slon przyslal mi opis tych funkcji w UNIX SVR4 gdzie jasno jest opisane, ze
operuja one
tylko i wylacznie na 7-mio bitowym kodzie ASCII, czego u Microsofta prozno
szukac.

Pozdrowienia
Karol Wojtiuk
Re: Uwaga: blad w funkcji isdigit .
#292
Author: Marek Kotowski
Date: Fri, 14 Nov 1997 15:40
46 lines
2567 bytes
Karol Wojtiuk wrote:
> Blad w isdigit jest poniewaz w opisie tej funkcji jak i w header'ach
> bibliotek nie jest zaznaczone, ze mozna operowac tylko na wartosciach od -1
> do 255, a deklaracja funkcji mowi jasno o dopuszczalnosci argumentu z
> zakresu int. 

  Calkowite nieporozumienie. Wartosci znakow nigdy nie beda zaznaczone,
albowiem standard nie mowi nic o wartosciach kodow. Nawet wartosc EOF
jakkolwiek tradycyjnie ujemna, formalnie moze byc takze dodatnia.
Definicja isdigit mowi tylko, ze zwraca ona wartosc rozna od zera,
jesli dany znak (konwertowany do int) jest '0' - '9' oraz wartosc
rowna zeru w przeciwnym wypadku. To, jakie sa wartosci kodow znakow
'0'-'9', to sprawa zupelnie inna i zalezna calkowicie od implementacji.
Wszystko.

> Na koniec warto dodac, ze to wszystko dotyczy tylko funkcji bibliotecznych
> Microsoft.

Niewykluczone, ze implementacja isdigit jest bledna, chociaz prawde
rzeklszy
musialbym sam zobaczyc, by uwierzyc. Napisalem duzo kodu z
wykorzystaniem
isdigit, i w BC, i w MSC, i w GNU, i nigdy z ta funkcja nie bylo
problemu.

> Slon przyslal mi opis tych funkcji w UNIX SVR4 gdzie jasno jest opisane, ze
> operuja one
> tylko i wylacznie na 7-mio bitowym kodzie ASCII, czego u Microsofta prozno
> szukac.

I bardzo dobrze. Funkcja isdigit jest funkcja standardowa. A w
standardzie
nie ma nic o kodzie ASCII, ani np. EBCDIC. Powiem nawet wiecej: zgodnie
ze
standardem znak moze byc kodowany takze na wiekszej liczbie bitow, 9,
12, czy 16. 
  I jeszcze jedno: dzialanie funkcji isdigit moze byc uzaleznione od
biezacej wersji jezykowej, ustawianej za pomoca standardowej funkcji
setlocale. Z tego, co Pan napisal, mogloby wynikac, ze w UNIX SVR4
jest to niedopuszczalne (wersje jezykowe inne niz "amerykanski"
angielski
wymagaja wiecej niz 7 bitow na znak. Tym samym w UNIX SVR4 (kompilator?)
takich wersji nie mozna by deklarowac. 

  Z powazaniem 
  Marek Kotowski
Re: Uwaga: blad w funkcji isdigit .
#293
Author: Karol Wojtiuk
Date: Fri, 14 Nov 1997 16:12
71 lines
3566 bytes
Marek Kotowski wrote in message <346C70EB.6EE9@imm.org.pl>...
>Karol Wojtiuk wrote:
>> Blad w isdigit jest poniewaz w opisie tej funkcji jak i w header'ach
>> bibliotek nie jest zaznaczone, ze mozna operowac tylko na wartosciach
od -1
>> do 255, a deklaracja funkcji mowi jasno o dopuszczalnosci argumentu z
>> zakresu int.
>
>  Calkowite nieporozumienie. Wartosci znakow nigdy nie beda zaznaczone,
>albowiem standard nie mowi nic o wartosciach kodow. Nawet wartosc EOF
>jakkolwiek tradycyjnie ujemna, formalnie moze byc takze dodatnia.
>Definicja isdigit mowi tylko, ze zwraca ona wartosc rozna od zera,
>jesli dany znak (konwertowany do int) jest '0' - '9' oraz wartosc
>rowna zeru w przeciwnym wypadku. To, jakie sa wartosci kodow znakow
>'0'-'9', to sprawa zupelnie inna i zalezna calkowicie od implementacji.
>Wszystko.
>

Zgadzam sie ze jest to nieporozumienie ale ze strony implementujacego
funkcje isdigit.
Jak widac z powyzszego podajac jako argument wartosc 258 lub -2 powinienem
otrzymac zero,
a otrzymuje wywalenie programu.

>> Na koniec warto dodac, ze to wszystko dotyczy tylko funkcji
bibliotecznych
>> Microsoft.
>
>Niewykluczone, ze implementacja isdigit jest bledna, chociaz prawde
>rzeklszy
>musialbym sam zobaczyc, by uwierzyc. Napisalem duzo kodu z
>wykorzystaniem
>isdigit, i w BC, i w MSC, i w GNU, i nigdy z ta funkcja nie bylo
>problemu.
>
>> Slon przyslal mi opis tych funkcji w UNIX SVR4 gdzie jasno jest opisane,
ze
>> operuja one
>> tylko i wylacznie na 7-mio bitowym kodzie ASCII, czego u Microsofta
prozno
>> szukac.
>
>I bardzo dobrze. Funkcja isdigit jest funkcja standardowa. A w
>standardzie
>nie ma nic o kodzie ASCII, ani np. EBCDIC. Powiem nawet wiecej: zgodnie
>ze
>standardem znak moze byc kodowany takze na wiekszej liczbie bitow, 9,
>12, czy 16.
>  I jeszcze jedno: dzialanie funkcji isdigit moze byc uzaleznione od
>biezacej wersji jezykowej, ustawianej za pomoca standardowej funkcji
>setlocale. Z tego, co Pan napisal, mogloby wynikac, ze w UNIX SVR4
>jest to niedopuszczalne (wersje jezykowe inne niz "amerykanski"
>angielski
>wymagaja wiecej niz 7 bitow na znak. Tym samym w UNIX SVR4 (kompilator?)
>takich wersji nie mozna by deklarowac.
>

Napisalem tylko skrotowo, bo chodzilo mi o blad gdy setlocale jest ustawione
na wersje "amerykanska". Prawdopodobnie tak u Microsofta jak i w UNIX SVR4
(chodzi tu zapewne o opis bibliotek standardowych tego systemu - sorry ale
sie nie znam) gdy wlaczymy wersje "polska" to wtedy jest wykonywany dla
isdigit zupelnie inny kod (to samo sie tyczy i innych funkcji is...). Co za
tym idzie nie jest tez generowany blad przy przekroczeniu powyzszego zakresu
poniewaz wtedy funkcja ta nie operuje juz na statycznej tablicy.

>  Z powazaniem
>  Marek Kotowski

Takze z powazaniem
Karol Wojtiuk
Re: Uwaga: blad w funkcji isdigit .
#294
Author: Qrczak
Date: Sat, 15 Nov 1997 13:14
47 lines
2310 bytes
On Thu, 13 Nov 1997, Karol Wojtiuk wrote:

> funkcja isdigit jest zadeklarowana następująco:
[...]

W Linuxowym GCC:

ISALPHA(3)          Linux Programmer's Manual          ISALPHA(3)

NAME
       isalnum,  isalpha,  isascii,  isblank,  iscntrl,  isdigit,
       isgraph,  islower,  isprint,  ispunct,  isspace,  isupper,
       isxdigit - character classification routines

[...]

DESCRIPTION
       These functions check whether c, which must have the value
       of an unsigned char or EOF, falls into a certain character
       class according to the current locale.

[...]

CONFORMING TO
       ANSI  -  C,  BSD 4.3.  isascii() is a BSD extension and is
       also an SVID extension.  isblank() is a GNU extension.

Tak więc tutaj jest jasno określone, że znaki przyjmować wartości 0..255
albo EOF.

W pliku include/ctype.h można przeczytać:

/* These are defined in ctype-info.c.
   The declarations here must match those in localeinfo.h.

   These point into arrays of 384, so they can be indexed by any `unsigned
   char' value [0,255]; by EOF (-1); or by any `signed char' value
   [-128,-1).  ANSI requires that the ctype functions work for `unsigned
   char' values and for EOF; we also support negative `signed char' values
   for broken old programs.  The case conversion arrays are of `int's
   rather than `unsigned char's because tolower (EOF) must be EOF, which
   doesn't fit into an `unsigned char'.  */

                                QRCZAK
    __("<             Marcin Kowalczyk
    \__/             qrczak@knm.org.pl
     ^^      http://kki.net.pl/qrczak/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads