Selamlar Saygılar Arkadaşlar ;
Integer Overflow türkçe adıyla TAMSAYI TAŞMASI demektir , bu problem daha çok alçak seviyeli diye tabir edilen low level de denir , C,C++ gibi programlama dillerinde ortaya çıkar . Bu problem integer tipindeki bir değişkenin alabileceği maksimum büyüklükteki sayıdan daha büyük bir sayı verdiğimizde ortaya çıkan değişimdir . Önrke verecek olursak 32 bit signed integer bir değer için 2*31)-1 :2147483647 en büyük değer olacaktır . Lain pozitif sayının toplamı acaba negatif olabilirmi ?
Hemen Örnekleyelim ;
-------------
| 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.
Integer Overflow türkçe adıyla TAMSAYI TAŞMASI demektir , bu problem daha çok alçak seviyeli diye tabir edilen low level de denir , C,C++ gibi programlama dillerinde ortaya çıkar . Bu problem integer tipindeki bir değişkenin alabileceği maksimum büyüklükteki sayıdan daha büyük bir sayı verdiğimizde ortaya çıkan değişimdir . Önrke verecek olursak 32 bit signed integer bir değer için 2*31)-1 :2147483647 en büyük değer olacaktır . Lain pozitif sayının toplamı acaba negatif olabilirmi ?
Hemen Örnekleyelim ;
-------------
| 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.
0 yorum:
Yorum Gönder