Integer Overflow (1 Viewer)

Joined
Jan 9, 2016
Credits
0
Rating - 0%

Integer Nedir ?
Integer sisteminize bağımlı olarak 32-64 bit sayıları saklayabilecek bir mekanizmadır.Integerler genelde daha anlaşılır olması için onluk sayı sistemi
kullanılırken bilgisayarlar ise ikilik sayı sistemini kullanırlar.

Onluk Sayı Sisteminde = 10 Rakam Kullanılırken ;

Bilgisayar Sisteminde ikilik Sayı sistemindeki Rakamlar ; 1,0 dır.

Integer Overflow ve Tehlikesi
Integer Overflowun oluştuktan sonra tespit edilmesi gibi bir durum söz konusu değildir arkadaşlar.Çünkü; Sonucun yanlış olduğunu kodlamış olduğumuz
ve oldurduğumuz uygulamaya anlatmanın bir yolu yoktur.Bu durumda arkadaşlar Integer Overflowun oluşmuna izin verilmemeli ve bunun için kodlarımızı
düzgün zaafiyet bırakmadan yazmamız gerekir arkadaşlar.Integer Overflowun oluştuktan sonraki tehlikesinden bahsedecek olursak arkadaşlar ; Doğrudan
bir tehlikesi olmadığı gibi başka hataların oluşmasına sebebiyet vererek stacktan veri gibi çeşitli işlemler yaptırabilir.
Integer Overflow ( Tamsayı Taşması)
Bu problem arkadaşlar genellikle low level dediğimiz 'C' gibi dillerde ortaya çıktığı görülmektedir.
Günümüzde low level dillerin zorluğundan ve onlara özel kod editörlerinin azlığından web ortamında kullanımı
bir hayli azalmıştır fakat bitmemiştir.Bundan yola çıkarakta Integer overflowun ortaya çıkma durumuda azalıştır diyebiliriz.
Tamsayı taşması ( Integer Overflow ) bir integerin tutabileceği maksimum sayıdan daha büyük sayıları saklamasını istediğimizde
Integer overflow oluşmaktadır.Bunun Sonucundada Sonuçtaki Değer Epey Bir Yanlışlıkla Değişmekte olup tamamiyle yanlıştır.
Buraya Kadar Integer ve Integer Overflowun Mantığını Anlamışsınız Varsayarak , Örneğimize geçelim ;

Bir Sayı Giriniz....( Integerdeki max değeri 500 Olarak Kabul görelim.)
-------------
| buraya | + 5 =
-------------

-------------
| 5 | + 5 = 10 --------------------------------> Girdiğimiz rakamlar Integerdeki max değerine kadar normal şekilde toplamayı yapacaktır.
------------- Peki ya max değerin üstünde bir değer girilirse ? Max Değer = 500
-------------
|501 | + 5 = -506
-------------
Şeklinde 2 Pozitif sayının toplamı ile elde edilen negatif sayı olacaktır. Buradaki sayı bilgisayardaki Integer değeri olarak temsil edilebilecek en
büyük sayıdan bir fazladır.Bu durumda ise taşma olup sonuç negatif çıkacaktır.
Bu durumda ise basit bir toplama işlemi yapan uygulamaların , büyük bir sayı karşısında nasıl davrandığını görmüş bulunduk arkadaşlar .
#include <stdio.h>
#include <string.h>
int main(int argc,char **argv){
int i;
unsigned short int a;
char *ptr="C Dilinde İnteger Overflowa Örnek by Turk DevilZ";
i = atoi(argv[1]);
a = i;
if(a > strlen(ptr)){ [1]
printf("length is too long");
return -1;
}
printf("character: %c",ptr); [2]

}
#./hello 6
Character: r
#./hello 500
length is too long
#./hello 500
Segmentation(Integer Overflow)
Daha önceki olan son örneğimizde bahsettiğimiz sorundan Dolayı Segmentetion(Integer Overflow) oluştu.
501 değeri Integerdeki Max değerimiz olan 500 den büyük olduğu için İşlem sonucunda aşağıdaki gibi değerler elde edilir.
500 mod(500+1)=0
Bundan dolayı
i = atoi(argv[1]);
a = i;
if(a > strlen(ptr)){ ------> ile belirtilen yerde 0> strlen(PRT) şartının sonucunda if-else yapısının içine girmek yerine
printf("character: %c",ptr); --------> Satırının içine girmektedir.
 

Users who are viewing this thread

Top