Portál AbcLinuxu, 12. května 2025 05:12
Ř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.