Portál AbcLinuxu, 25. dubna 2024 14:46
Řešení dotazu:
int spocitej(int cislo, int *pole, int velikost_pole) {
int i;
int vysledek = 0;
for (i = 0; i < velikost_pole; i++)
if (pole[i] == cislo)
vysledek++;
return vysledek;
}
ssize_t
je -1, SSIZE_MAX, jestli se nepletu - čistě to jen přidává možnost vracet chybu jako -1 .
ssize_t
je roztodivná a že to není (dle specifikace) typický signed
typ. Je to taková „ujetina“ jako pthread_t
.
Když vám přeteče int, smaže se vám třeba celý pevný disk!A jak to spolu souvisí? Pokud v C provedete operaci INT_MAX+1, tak je podle standardu naprosto vpořádku, že se po "signed overflow" vykoná obdoba
rm -rf $HOME
.
pokud systemove neprogramuje tak HW ochrana zasahne at si norma C rika cokolivChápu správně, že HW tvým programům nějak brání smazat domovský adresář? Můj HW to bohužel neumí, na něm program udělá příslušné volání jádra, to zkontroluje oprávnění (což projde vzhledem k tomu, že program běží pod uživatelem jenda a domovský adresář má jako vlastníka nastaveného uživatele jenda) a soubor smaže.
Ale chtel bych vydet prekladac ktery by to prelozil jako systemove volani(rm)Už jsem chtěl Jardíkovi navrhnout, jestli něco takového nechce vyrobit. Mohla by to být docela sranda .
int add_one(int val) { if (val == INT_MAX) { system("rm -rf /home/jenda"); return INT_MIN; } return val+1; }
Nemusí to být přímo Knuthovo: umění programování, i když to je bezesporu nádhernéA pro takového začátečníka nejspíš i nepoužitelné.
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.