Thread overview
signed integer overflow Nedir?
Nov 03, 2015
agora
Nov 03, 2015
agora
November 03, 2015

Merhaba. D'nin kaynak kodlarını okuyorum yaklaşık 3 aydır. Gıdım gıdım :D

Lexer'da bir kısma denk geldim. Bu kısımda signed integer overflow yazıyordu. Bunun integer overflow'dan farkı nedir? Neden unsigned integer overflow gibi bir yakalama mekanizması yok. Kodlarda hatırladığım kadarıyla unsigned case yapısı vardı ancak yakalamıyordu.

https://github.com/D-Programming-Language/dmd/blob/master/src/lexer.d#L1987

case FLAGS_decimal | FLAGS_long:
           if (n & 0x8000000000000000L)
           {
               if (!err)
               {
                   error("signed integer overflow");
                   err = true;
               }
               result = TOKuns64v;
           }
           else
               result = TOKint64v;
           break;

Burada yaptığı şey yani FLAGS_decimal neden kullanılıyor?

Burada anlamam gereken şey derleyiciye ya da D ile derlenen programa "n & 0x8000000000000000L" şeklinde bir değer yollarsam overflow mu olacak? Gerçi burada err=true olmuş

Bu err kısmı öncelikle şurada tanımlı:

final TOK number(Token* t)
   {
       int base = 10;
       const(char)* start = p;
       uint c;
       uinteger_t n = 0; // unsigned >=64 bit integer type
       int d;
       bool err = false;

Merak ettiğim şey err = true olunca engelleyici bir mekanizma çalışıyor mu? Çalışıyor ise err=true; nereye ne yolluyor? Nasıl bakabilirim?

Mesela integer overflow yakalama mekanizmasına bir goto ile yollama var sanırım.

Ldone:
       if (overflow && !err)
       {
           error("integer overflow");
           err = true;
       }

Buradaki Ldone: kısmından anladığım kadarıyla.

Ancak ne overflow bool değeri ne de err bool değeri bir yerlerde bir şeyler değiştiriyor görünmüyor. Sadece true ya da false yapılıyor. Nereyi etkilediğini anlamadım.

Büyük dosyalarda kafam karışıyor. Kodları yazmak değil de okumak baya zevkli. Ancak not defterim doldu taştı D notlarıyla.

Umarım bu sorularım anlamsız ya da manasız değildir :(

Teşekkürler

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 03, 2015

Yani error işlevine bakmam gerekli. Bir sürü işlev gördüm. Bir de goto için mümkün olduğunca kaçınılması lazım denmişti bir yerde okuduğum kadarıyla.

Neden var D kodlarında?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 03, 2015

Alıntı (agora):

>

Bu kısımda signed integer overflow yazıyordu. Bunun integer overflow'dan farkı nedir?

Ben dmd'nin kodlarını tanımıyorum. Bunlar kaynak koddaki hazır değerlerle ilgili kodlar, değil mi? O hata mesajını nasıl tetikleyeceğimi anlayamadı. Yalnızca 'integer overflow' oluyor:

   auto n = 0x1000_0000_0000_0000_0000;

O kod (ve başka değerler) hep 'integer overflow' üretiyor.

Alıntı:

>

Burada yaptığı şey yani FLAGS_decimal neden kullanılıyor?

Hazır değerler onaltılı olarak da verilebilir ya... Hazır değerin türü nasıl yazıldığıyla yakından ilgili olabiliyor. Şurada "Tamsayı değerlerin türleri" başlığına bakabilirsin:

http://ddili.org/ders/d/hazir_degerler.html#ix_hazir_degerler.haz%C4%B1r%20de%C4%9Fer

Alıntı:

>

Bu err kısmı öncelikle şurada tanımlı:

dmd, err değişkenini kendisi için hata mesajı verirken kullanıyor... gibi görünüypor... Ama artık kullanılmıyor da olabilir.

Alıntı:

>

Ancak ne overflow bool değeri ne de err bool değeri bir yerlerde bir şeyler değiştiriyor görünmüyor.

Herhalde error() işlev çağrısı derlemeyi durduruyor. Dediğim gibi, o değişkenler eskiden kalmış olabilir. (Projeler yaşlandıkça böyle şeylerle çok karşılaşılır. Programcılar ne olduğunu tam anlamadıkları için bir şeyleri silmekten çekinirler.)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 03, 2015

goto'dan kaçınılır çünkü yapısal değildir. Kodun nereden nereye aktığı anlaşılamaz ve "spaghetti code" denen durum ortaya çıkar. (Öte yandan, break ve continue da aslında goto gibidir ama onlara gözyumarız.)

Derleyici gibi bir kere çalışıp hemen sona erecek olan programlarda bazı öneriler gözardı edilir. Örneğin, dmd'nin hiç bellek geri vermediğini duymuştum; nasıl olsa derleyici sonlanınca işletim sistemi bütün kaynakları geri alıyor diye...

Kaçınmak güzel bir sözcük. :) Olabildiğince uzak durmak anlamına geliyor; yararlı olduğu düşünülürse kullanılır.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]