Forum: D Programlama Dili RSS
signed integer overflow Nedir?
agora #1
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: signed integer overflow Nedir?
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/…

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
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

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_deger…

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.

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
agora #3
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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?
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 08:13:23 (UTC -08:00)