Portál AbcLinuxu, 7. května 2025 00:49
return ret ? ret : len;
ukazuje na nepříliš promyšlenou strukturu kódu, protože zbytečně porovnávám ret
na konci funkce, když už někde dříve muselo být jasné a musel jsem otestovat, že není nulové (a tedy jsem měl funkci ukončit už tam), protože jinak by len
bylo inicializováno.
-pedantic
) musíš mít deklarace proměnných na začátku scope. Ale nevim, podle jakýho standardu se kompiluje jádro.
No a jednak si umím představit i takovej kód, kde by to opravdu muselo být rozlišeno až na konci. Asi by to chtělo vidět ten konkrétní kód...
Jednak mám dojem, že dle C89 (s -pedantic
) musíš mít deklarace proměnných na začátku scope. Ale nevim, podle jakýho standardu se kompiluje jádro.
To by nevadilo, to varování vyvolá až použití.
No a jednak si umím představit i takovej kód, kde by to opravdu muselo být rozlišeno až na konci. Asi by to chtělo vidět ten konkrétní kód...Já si ho samozřejmě taky umí představit, to ale neznamená, že je strukturálně správně.
static int uhid_hid_get_raw(struct hid_device *hid, unsigned char rnum, __u8 *buf, size_t count, unsigned char rtype) { struct uhid_device *uhid = hid->driver_data; __u8 report_type; struct uhid_event *ev; unsigned long flags; int ret; size_t uninitialized_var(len); struct uhid_feature_answer_req *req; if (!uhid->running) return -EIO; switch (rtype) { case HID_FEATURE_REPORT: report_type = UHID_FEATURE_REPORT; break; case HID_OUTPUT_REPORT: report_type = UHID_OUTPUT_REPORT; break; case HID_INPUT_REPORT: report_type = UHID_INPUT_REPORT; break; default: return -EINVAL; } ret = mutex_lock_interruptible(&uhid->report_lock); if (ret) return ret; ev = kzalloc(sizeof(*ev), GFP_KERNEL); if (!ev) { ret = -ENOMEM; goto unlock; } spin_lock_irqsave(&uhid->qlock, flags); ev->type = UHID_FEATURE; ev->u.feature.id = atomic_inc_return(&uhid->report_id); ev->u.feature.rnum = rnum; ev->u.feature.rtype = report_type; atomic_set(&uhid->report_done, 0); uhid_queue(uhid, ev); spin_unlock_irqrestore(&uhid->qlock, flags); ret = wait_event_interruptible_timeout(uhid->report_wait, atomic_read(&uhid->report_done), 5 * HZ); /* * Make sure "uhid->running" is cleared on shutdown before * "uhid->report_done" is set. */ smp_rmb(); if (!ret || !uhid->running) { ret = -EIO; } else if (ret < 0) { ret = -ERESTARTSYS; } else { spin_lock_irqsave(&uhid->qlock, flags); req = &uhid->report_buf.u.feature_answer; if (req->err) { ret = -EIO; } else { ret = 0; len = min(count, min_t(size_t, req->size, UHID_DATA_MAX)); memcpy(buf, req->data, len); } spin_unlock_irqrestore(&uhid->qlock, flags); } atomic_set(&uhid->report_done, 1); unlock: mutex_unlock(&uhid->report_lock); return ret ? ret : len; }Stačilo by přiřadit
len
do ret
v té else větvi.
ret
i celá ta funkce je int
, kdežto len
je size_t
.
Principielne resitelny to samozrejme je a s problemem zastaveni to nema nic spolecnyho.
Důkaz máte? :)
Ale co dělat u integerů?To by se asi muselo implementovat na procesoru, kdy libovolná aritmetická operace s nějakým specifickým číslem (nebo číslem s flagem) by způsobila vyhození z běžného běhu.
Ukazatele by samozřejmě šlo inicializovat na NULL, a osobně bych byl pro, ale spousta lidí by (právem) začala nadávat, že to je v drtivé většině případů zcela zbytečná instrukce a přístup do paměti.Tak třeba #ifdef DEBUG. Furt lepší kfree(NULL) než kfree(rand()).
Pokud někdo potřebuje něco takového, tak nepoužije C, ale Adu.Takže už jen stačí přepsat jádro z Céčka do Ady…
jako ke třeba přetečení znaménkového integeruV tom problém nevidím. Když přeteče, tak se začne počítat znova od spodní hranice rozsahu, ne?
Dle normy je to nedefinovaná operace a tudíž se může stát cokoliv. Například v kódu:jako ke třeba přetečení znaménkového integeruV tom problém nevidím. Když přeteče, tak se začne počítat znova od spodní hranice rozsahu, ne?
int a, b;
...
if(a > 0 && b > 0)
{
int c = a + b;
if(c < 0)
{
printf("Overflow");
}
}
může překladač usoudit, že při sčítání dvou kladných čísel nemůže nastat "legální" situace, kdy výsledek součtu bude záporný a Overflow se nikdy nevypíše.
if(c < 0) { printf("Overflow"); }mi moc validní nepřijde. Není k detekci přetečení určen overflow flag v SR?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.