Optimization eller sort magi?

From: Anders S. Jensen (none@doozer--freakout.dk.lh.bsd-dk.dk)
Date: Sun 26 Oct 2003 - 23:09:59 CET


Date: Sun, 26 Oct 2003 23:09:59 +0100
From: "Anders S. Jensen" <none@doozer--freakout.dk.lh.bsd-dk.dk>
To: bsd-dk@bsd-dk.dk
Subject: Optimization eller sort magi?

Hej venner,

Jeg har en svaghed for 3D solid modeling, og fald for nylig over
noget der hedder BRL-CAD (http://ftp.arl.mil/brlcad/).
Det er supporteret til FreeBSD 4.6, og jeg ville naturligvis gerne
have det til at spille under 4.8 og 5.1.
Det er også lykkes mig med et par små patches hist og pist, men det
som gjorde udslaget til allersidst var lidt mystisk.

En funktion initialiserede en datastruktur på flg. måde:

void
mmenu_init()
{
    menu_state->ms_flag = 0;
    menu_state->ms_menus[MENU_L1] = MENU_NULL;
    menu_state->ms_menus[MENU_L2] = MENU_NULL;
    menu_state->ms_menus[MENU_GEN] = MENU_NULL;
}

Når jeg starter programmet er det meningen at det skal spawne nogle
childs og daemonisere sig selv. Ingen ting sker.
Jeg havde det gennem gdb i et godt stykke tid, men kunne ikke rigtig
se hvor noget gik galt (det er nu ikke gdb's skyld...).

I desperation satte jeg et par "krokodillenæb" på for at følge med i
hvor langt programmet nåede og samme funktion så nu således ud:

void
mmenu_init()
{
    fprintf(stdout, "DBG: inside mmenu_init()\n");
    fprintf(stdout, "DBG: menu_state->ms_flag = 0\n");
    menu_state->ms_flag = 0;
    fprintf(stdout, "DBG: menu_state->ms_menus[%d] = %d\n", MENU_L1, MENU_NULL);
    menu_state->ms_menus[MENU_L1] = MENU_NULL;
    fprintf(stdout, "DBG: menu_state->ms_menus[%d] = %d\n", MENU_L2, MENU_NULL);
    menu_state->ms_menus[MENU_L2] = MENU_NULL;
    fprintf(stdout, "DBG: menu_state->ms_menus[%d] = %d\n", MENU_GEN, MENU_NULL);
    menu_state->ms_menus[MENU_GEN] = MENU_NULL;
}

Og vupti! Så virker alting. Eneste forskel er fprintf'erne.
Mit spørgsmål er: kan en eller anden obskur compiler optimering gøre at
mmenu_init() bliver en tom stub, når der kun bliver manipuleret med
en global struktur eller hvad kan forklaringen ellers være?

Jeg har været meget systematisk med at isolere denne situation, så jeg ved
at med helt nyudpakket source kode + mine 4.8 patches virker det ikke.
Med andet helt nyudpakket source kode + mine 4.8 patches + ovennævnte
fprintf's virker det.

I'm puzzled!

-- 
Mvh,

Anders S. Jensen



This archive was generated by hypermail 2b30 : Wed 15 Nov 2006 - 18:24:32 CET