Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Phân tích bí danh con trỏ (Points-to Analysis) trên CFG có vòng lặp

    Phân tích bí danh (alias analysis) kiểu may-point-to xác định, tại mỗi điểm trong chương trình, tập các ô nhớ mà một con trỏ có thể trỏ tới — thông tin then chốt để trình biên dịch quyết định các tối ưu hóa an toàn (ví dụ CSE, loại bỏ tải/lưu dư thừa).

    Cho một CFG gồm nnn khối đánh số 1..n1..n1..n (khối 111 là điểm vào), mỗi khối chứa một dãy lệnh con trỏ theo thứ tự, mỗi lệnh có một trong hai dạng:

    • p = &x — con trỏ ppp được gán trỏ tới ô nhớ xxx (tập trỏ-tới của ppp trở thành {x}\{x\}{x}, ghi đè hoàn toàn tập cũ);
    • p = q — con trỏ ppp được sao chép từ con trỏ qqq (tập trỏ-tới của ppp trở thành đúng tập trỏ-tới hiện tại của qqq, ghi đè tập cũ của ppp).

    Tập trỏ-tới của một con trỏ tại điểm vào của khối bbb là hợp (union) các tập trỏ-tới của nó tại điểm ra của tất cả khối cha (predecessor) của bbb (nếu bbb là khối 111, mọi con trỏ có tập trỏ-tới rỗng tại điểm vào — không phụ thuộc khối cha). Các lệnh trong khối được xử lý tuần tự để tính tập trỏ-tới tại điểm ra. Vì đồ thị có thể có vòng lặp, cần lặp lại việc tính toán trên toàn bộ CFG cho đến khi tập trỏ-tới của mọi khối không còn thay đổi (điểm bất động).

    Cho một truy vấn gồm chỉ số khối QQQ và tên con trỏ ppp, hãy in ra tập trỏ-tới của ppp tại điểm ra của khối QQQ sau khi đạt điểm bất động.

    Ví dụ: CFG hình thoi 1→21\to21→2, 1→31\to31→3, 2→42\to42→4, 3→43\to43→4; khối 2 có lệnh p = &x, khối 3 có lệnh p = &y, khối 4 có lệnh q = p. Tại điểm vào khối 4, tập trỏ-tới của ppp là hợp của {x}\{x\}{x} (từ khối 2) và {y}\{y\}{y} (từ khối 3), tức {x,y}\{x,y\}{x,y}; do đó sau lệnh q = p, tập trỏ-tới của qqq tại điểm ra khối 4 là {x,y}\{x,y\}{x,y}.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (1≤n≤81 \le n \le 81≤n≤8).
      • Với mỗi khối i=1..ni=1..ni=1..n theo thứ tự: một dòng chứa sis_isi​ (0≤si≤100 \le s_i \le 100≤si​≤10) — số lệnh trong khối, tiếp theo sis_isi​ dòng, mỗi dòng là một lệnh dạng p = &x hoặc p = q (tên con trỏ/ô nhớ là chuỗi chữ cái thường, các token cách nhau đúng một khoảng trắng).
      • Một dòng chứa số nguyên mmm (0≤m≤200 \le m \le 200≤m≤20) — số cạnh của CFG.
      • mmm dòng tiếp theo: mỗi dòng hai số nguyên u vu\ vu v (1≤u,v≤n1 \le u,v \le n1≤u,v≤n) biểu diễn cạnh u→vu \to vu→v.
      • Dòng cuối: chỉ số khối truy vấn QQQ và tên con trỏ ppp, cách nhau bởi khoảng trắng.
    • Định dạng đầu ra:

      In ra một dòng: danh sách các ô nhớ trong tập trỏ-tới của ppp tại điểm ra của khối QQQ, sắp xếp theo thứ tự từ điển, cách nhau bởi dấu phẩy (không có khoảng trắng). Nếu tập rỗng (hoặc ppp chưa từng được gán), in ký tự -.

    Ví dụ:

    Đầu vào:

    4
    1
    p = &x
    0
    1
    p = &y
    0
    4
    1 2
    2 3
    3 2
    2 4
    2 p
    

    Đầu ra:

    x,y
    

    Đầu vào:

    4
    1
    p = &x
    1
    p = &y
    0
    1
    q = p
    4
    1 2
    1 3
    2 4
    3 4
    4 q
    

    Đầu ra:

    x,y
    

    Đang tải editor...