Integer Overflows / underflows Trang này đã được đánh dấu để được xem xét để xóa. #REDIRECT Integer_overflow sửa đổi cuối: 2009/06/03 Mô tả Integer overflow thuộc về một gia đình lỗi logic. Nó xảy ra khi một phạm vi nhất định của int (số nguyên) gõ số được tràn do phép tính số học. Nói chung chỉ có hai hoạt động đó gây ra các loại lỗi - cộng và phép nhân. Các yếu tố rủi ro TBD Ví dụ Ví dụ 1 (bổ sung) rezos @ bezel ~ / phòng thí nghiệm / số nguyên $ cat add.c #include
#include
int main (void)
{
int a; // a = 2147483647; a = INT_MAX; printf ("int a (INT_MAX) =% d (0x% x), int a (INT_MAX) + 1 =% d (0x% x ) n ", a, a, a + 1, a + 1); return 0; } rezos @ bezel ~ / phòng thí nghiệm / số nguyên $ ./add int a (INT_MAX) = 2147483647 (0x7fffffff), int a (INT_MAX) + 1 = -2147483648 (0x80000000) Bằng cách thêm 1 vào ký (+ hoặc -) có thể lớn nhất giá trị số nguyên, chúng tôi ghi đè lên các bit dấu. Trong ngắn hạn, bằng cách thêm hai con số tích cực chúng tôi nhận được một số tiêu cực lớn. Ví dụ 2 (nhân) rezos @ bezel ~ / phòng thí nghiệm / số nguyên $ cat multiplication.c #include
#include
#include
#include
int main (int argc, char ** argv)
{
int i, j, z = 0x00000001;
char * tab; if (argc <2) _exit (1); i = atoi (argv [1]); if (i> 0) { tab = malloc (i * sizeof (char *)); if (tab == NULL) _exit (2); } for (j = 0; j
tab [j] = z ++; for (j = 0; j
printf ("tab [j] = 0x% x n", tab [j]); return 0; } rezos @ bezel ~ / phòng thí nghiệm / số nguyên $ ./multiplication 1073741824 Segmentation lỗi Các chương trình nên viết một "z" giá trị vào các mảng của con trỏ và sau đó in ra. Với một kích thước mảng lựa chọn đặc biệt (số lượng phần tử của nó) nó có thể sử dụng một lỗi tràn số nguyên tràn mảng "tab". Ví dụ dưới đây giải thích lý do tại sao nó xảy ra. rezos @ bezel ~ / phòng thí nghiệm / số nguyên $ cat multi.c # bao gồm
int main (void)
{
printf ("1073741824 * 4 =% d n", 1073741824 * 4);
return 0;
}
Trong chương trình này chúng ta nhân 1073741824 * 4 vì sizeof (char *) sẽ trả về 4. rezos @ bezel ~ / phòng thí nghiệm / số nguyên $ gcc -o -ggdb multi.c đa multi.c: Trong chức năng 'chính': multi.c: 6: cảnh báo: tràn số nguyên trong biểu hiện Trình biên dịch cảnh báo chúng ta rằng chương trình có chứa một biểu hiện gây ra một số nguyên tràn. Để chắc chắn rằng những gì là kết quả của phép nhân sẽ là: rezos @ bezel ~ / phòng thí nghiệm / số nguyên $ ./multi 1073741824 * 4 = 0 malloc (0) (trong ví dụ chính) sẽ cấp phát bộ nhớ với kích thước 0 một cách chính xác (poprawnie) / thành công (z powodzeniem), và điều đó sẽ cho phép ghi đè lên phân đoạn bộ nhớ trên heap. cấp phát bộ nhớ với một giá trị tiêu cực có thể gây ra phân bổ của phân đoạn bộ nhớ rất nhỏ hoặc rất lớn phụ thuộc vào việc thực hiện * alloc () chức năng. Lỗi tràn bộ nhớ cũng có thể dẫn đến tình trạng báo cáo tình trạng, trong đó có nghĩa vụ phải kiểm tra bộ đệm ranh giới, được bỏ qua. lỗi Integer overflow không luôn luôn là một mối đe dọa mình. Tuy nhiên, họ cung cấp khả năng ghi đè lên hoặc đọc nội dung bộ nhớ ngoài boudries của bộ đệm, ví dụ trong lập chỉ mục đệm.
đang được dịch, vui lòng đợi..