Op 10 augustus 2020 18:58:05 schreef henri62:
Wat een achterlijke optimalisatie! Foei voor de gcc ontwikkelaars.
Ze zeggen dat het een "real world" verbetering oplevert.
Ik denk dat het gaat om gevallen als:
code:
void somefunc (mytype *p)
{
if (p == NULL) return; // of fout geven.
p->this = that;
een_macro (p);
}
Die macro (of inline functie) kan je eventueel alleen voor als debugging aanstaat ook nog iets laten doen als:
code:
if (p == NULL) return;
// doe iets met p.
(even als de body van een inline functie geschreven niet het gedoe om een meer-regelige-macro te schrijven d'r bij gehaald. )
Hier ziet de compiler dus als p null was geweest, de this/that regel zou zijn gecrashed, dus de volgende if (p == NULL) hoeft dan niet meer gemaakt te worden. Zo vervalt er wat code.
Ze zeggen ook dat het niet makkelijk te vermijden is dat de warning triggert in code die toch nooit uitgevoerd kan worden.
@sparkygsx: Het nut van de debugger is beperkt.
Als ie de null dereference tegenkomt gooit ie een fault, en dan komt ie in "unhandled_fault_handler ()" terecht. Voor een paarhonderd bytes kan de maker van chibios daar wat nuttigs van maken, maar dat ding is waardeloos.
code:
void unhandled_fault_handler (void)
{
struct debug {
void *where;
void *arg;
uint32_t type;
} dbg;
dbg.where = <waar de hardware de IP opslaat>
dbg.arg = <addres causing fault>
dbg.type = <fault_cause>
while (1);
}
Dan kan je in de debugger met print dbg zien waar de boel gecrasht is en welk adres de fout heeft getriggerd. Deze functie zit in chibios, ik krijg het niet voor mekaar om hem te overrulen in mijn code. Als ik IN chibios ga zitten wijzigen heb ik straks problemen als ik chibios wil upgraden of zijn m'n wijzigingen weer ongedaan gemaakt als ik "schoon" begin.
Daarnaast kan je runnen tot een bepaald punt en dan met step en next kijken wanneer ie weer crasht.
Dat werkt niet want na de eerste step dan zit ie in de timer interrupt ipv op de volgende regel in je code. Dus, ja de debugger hangt er soms aan, maar door dit soort dingen werkt dat minder prettig als zou moeten.
Update: Binnen GCC lijkt er een productieve discussie ontstaan te zijn over deze warning. Er gaan stemmen op om te proberen hem aan te zetten: Er zijn nog "maar" 700 plekken in gcc waar de code iets aangepast moet worden om de warning niet te triggeren.....
Er wordt ook gesproken over may/must. Ik denk dat mijn code dan een MUST geval is: De code-flow MOET de null dereference tegenkomen. Terwijl in veel andere gevallen er een "may" is dat er een takje van de code toevallig iets raars doet waardoor de warning zou triggeren maar dat dan niet de hele code nooit meer verder kan.
[Bericht gewijzigd door rew op 11 augustus 2020 08:35:28 (12%)