Mô hình CFG thể hiện luồng của điều khiển trong chương trình (thủ tục), là một đại diện khác của mã nguồn chương trình. Ký hiệu G=(N,E), nó như là một đồ thị có hướng gồm 2 thành phần chính:
+ Nút n ∈ N: gọi là các khối cơ bản. Một khối cơ bản là một dãy tối đa các lệnh với một điểm vào duy nhất, một điểm ra duy nhất và không có nhánh nội bộ.
+ Cạnh e=(ni, nj) ∈ E: chuyển từ khối ni sang khối nj.
Hình 3.2 Một ví dụ về CFG Cấu trúc cơ bản của CFG:
Nhận dạng một khối cơ bản:
Đầu vào: Một dãy các lệnh, khai báo. Cách nhận dạng một khối cơ bản như sau: Xác định các điểm dẫn đầu (leaders), các lệnh đầu tiên của các khối cơ bản: + Lệnh đầu tiên trong chuỗi (điểm vào) là một leader.
+ Bất kỳ lệnh nào mà là mục tiêu của một nhánh (có điều kiện hoặc không điều kiện) là một leader.
+ Bất kỳ lệnh nào ngay sau một nhánh (có điều kiện hoặc không điều kiện) hoặc quay trở lại là một leader.
Đối với mỗi leader, khối cơ bản của nó là leader và tất cả các lệnh tới sau, nhưng không bao gồm các leader tiếp theo hoặc kết thúc của chương trình.
Ví dụ: Các khối cơ bản trong chương trình sau:
Tạo CFG
Phân vùng mã lệnh thành các khối cơ bản
Thêm cạnh tương ứng đểđiều khiển luồng giữa các khối: + không điều kiện goto
+ Nhánh có điều kiện - nhiều cạnh
+ Luồng tuần tự - điều khiển đi đến khối tiếp theo (nếu không có nhánh ở cuối) Nếu không có duy nhất nút vào n0 và nút thoát nf, thêm các nút giả và chèn cạnh cần thiết vào.
+ Đơn giản hóa nhiều phân tích và thuật toán chuyển đổi Ví dụ, CFG như hình 3.4:
Hình 3.4 Một CFG đại diện cho một phương thức