Đọc mã nguồn và những điều hấp dẫn

Theo mọi người thì K bằng bao nhiêu để kết quả chạy chương trình tràng số nhỉ

Hi Pham The Tam.
Code này thì làm sao ?

Ý bạn là “tràn số”?
Bạn định nghĩa cái “tràn số” của bạn coi nào?
Hay ý của bạn là buffer overflow?
Nếu vậy thì khi K bé hơn 0 hoặc lớn hơn 16 nhé.

1 Like

Nguyên nhân làm tràn số của nó là gì á nhr ? Tớ vẫn chưa tìm ra lý do được

(Mặc định 32 bit)
Cho con trỏ có kiểu Type*, đặt là a; cho n là số mà sẽ được cộng vào con trỏ, ta có điều sau là đúng:

a + n == sizeof(Type) * n + a;

Ví dụ có char* a = 1, n = 4, vậy ta có:

a + n == 1 + sizeof(char) * 4 == 1 +  1 * 4 == 5

Ví dụ: int* a = 2, n = 6, ta có:

a + n == 2 + sizeof(int) * 6 == 2 + 4 * 6 == 26

Với biểu thức này (*((int*) (buffer + K))), buffer + K là lấy vị trí của mảng buffer trong bộ nhớ, cộng với K, vì sizeof(char) == 1 nên cứ cộng bình thường, được vị trí mới, đặt là i, ta ép nó sang kiểu con trỏ int*, cuối cùng là phép “khử tham chiếu” (dereference), tức là dùng vị trí i để vào bộ nhớ và đọc/ghi vào chỗ đó với kích thước sizeof(int).

    (*((int*) (buffer + -1)))
    -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
     ?  ?  ? H e l l o _ W o r l d  \0 \0 \0 \0 \0 \0 \0 \0 \0  ?  ?  ?
           ^ ^ ^ ^
           ^
           Tràn
       

    (*((int*) (buffer + 17)))
    -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
     ?  ?  ? H e l l o _ W o r l d  \0 \0 \0 \0 \0 \0 \0 \0 \0  ?  ?  ?
                                                       ^  ^  ^  ^
                                                                ^
                                                                Tràn

Tràn, hoặc là overflow chỉ là một cách nói ước lệ, nói một cách chính xác thì cái này gọi là “ghi, hoặc đọc dữ liệu mà vốn không/chưa được cấp phát cho chương trình, hoặc đọc xen vào dữ liệu khác không liên quan”.

2 Likes

mình có thể trao đổi với bạn qua facebook được không nhỉ, face mình là thế tâm https://www.facebook.com/than.phamthetam

à có 1 câu hỏi nữa tớ cũng đang tò mò, hãy thay đổi giá trị K để giá trị X=1

Cho K chạy từ -20 tới 0 rồi suy luận :joy:

Giải thích thì dài, cái này phải có kiến thức assembly.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?