erlug
[Top] [All Lists]

Re: [Erlug] Note ed esempi talk C++

To: ERlug - Lista Pubblica <erlug@xxxxxxxxxxxxxx>
Subject: Re: [Erlug] Note ed esempi talk C++
From: Enrico Zini <enrico@xxxxxxxxxxxxxx>
Date: Tue, 2 Dec 2014 09:44:24 +0200
On Sun, Nov 30, 2014 at 10:44:36PM +0100, m wrote:

> hai poi capito perché beccavi un segfault, quando cambiavi la
> definizione di fibonacci, rendendo la constexpr non terminante (ma
> compilante) ?

Nelle prove che ho fatto oggi, il segfault è dovuto al fatto che la
funzione è eseguita a runtime invece che espansa come constexpr, e
quindi segfaulta per aver riempito lo stack. Avevamo fatto uno stack
trace con gdb durante il talk?

Questo sorgente compila in un programma che non termina, con
qualunque livello di -O, perché forza la valutazione della constexpr a
compile time, e forse per tail call optimization, viene compilata
correttamente come loop infinito:

        constexpr int rec(int n)
        {
            return rec(n);
        }

        const int a(rec(5));

        int main()
        {
            return a;
        }

Questo invece segfaulta o non termina a seconda dei livelli di -O: con
-O bassi, ignora constexpr e la compila come funzione, per cui
segfaulta per riempimento di stack. Con -O alti, rientra nel caso
precedente:

        constexpr int rec(int n)
        {
            return rec(n);
        }

        int main()
        {
            return rec(5);
        }

Tutto sommato, ora sembra avere un senso.


Ne approfitto per segnalare, invece di "break __cxa_throw" in gdb, un
piú comodo "catch throw". "help catch" in gdb mostra cose molto carine.


Enrico

-- 
GPG key: 4096R/E7AD5568 2009-05-08 Enrico Zini <enrico@xxxxxxxxxxxxxx>

Attachment: signature.asc
Description: Digital signature

<Prev in Thread] Current Thread [Next in Thread>