2012-03-21 27 views

Trả lời

16

Frama-C là nền tảng phân tích tĩnh nguồn mở với a slicer for C programs dựa trên việc tính toán Biểu đồ phụ thuộc chương trình.

Lưu ý rằng việc cắt chương trình thực tế được viết bằng ngôn ngữ lập trình thực như C bao gồm nhiều trường hợp đặc biệt và khái niệm được lướt qua trong các ấn phẩm khoa học. Tuy nhiên, tôi tin rằng bạn sẽ không tìm thấy gì đơn giản hơn tính toán PDG của Frama-C, đầu tiên bởi vì nó là mã nguồn mở duy nhất (mà tôi biết), và thứ hai vì bất kỳ tính toán PDG nào khác xử lý các chương trình C sẽ có để giải quyết các vấn đề tương tự và giới thiệu các khái niệm tương tự.

Dưới đây là một ví dụ:

int a, b, d, *p; 

int f (int x) { 
    return a + x; 
} 

int main (int c, char **v) { 
    p = &b; 
    a = 1; 
    *p = 2; 
    d = 3; 
    c = f(b); 
} 

Lệnh frama-c -pdg -dot-pdg graph -pdg-print t.c tạo dot file graph.main.dotgraph.f.dot chứa PDG của main()f() tương ứng.

Bạn có thể sử dụng chương trình dot đến khá-in một trong số họ như sau: dot -Tpdf graph.main.dot > graph.pdf

Kết quả là dưới đây:

PDG of main()

Note rìa từ nút c = f(b); đến nút *p = 2;. Một tính toán PDG tuyên bố là hữu ích cho các chương trình C phải xử lý răng cưa. Mặt khác, một slicer sử dụng PDG này để cắt tiêu chí “đầu vào của câu lệnh c = f(b);” sẽ có thể xóa d = 3;, không thể ảnh hưởng đến cuộc gọi chức năng, thậm chí thông qua truy cập con trỏ *p. Máy cắt của Frama-C sử dụng các phụ thuộc được chỉ định bởi PDG để chỉ giữ các câu lệnh hữu ích cho tiêu chí cắt do người dùng chỉ định. Ví dụ, lệnh frama-c -slice-wr c t.c -then-on 'Slicing export' -print sản xuất các chương trình giảm dưới đây, nơi sự phân công để d đã bị xoá:

/* Generated by Frama-C */ 
int a; 
int b; 
int *p; 
int f_slice_1(int x) 
{ 
    int __retres; 
    __retres = a + x; 
    return (__retres); 
} 

void main(int c) 
{ 
    p = & b; 
    a = 1; 
    *p = 2; 
    c = f_slice_1(b); 
    return; 
} 
+0

cảm ơn bạn rất nhiều vì đã giúp đỡ đáng kể của bạn. Tôi bắt đầu học cách sử dụng Frama-C. Trong tài liệu tham khảo của Frama-C, tôi không thể tìm thấy ý nghĩa của dòng trong đồ thị graph.main.dot. Các kiểu dòng khác nhau có ý nghĩa gì? hoặc có bất kỳ tài liệu nào về điều này. – user1283336

+0

@ user1283336 Có 3 loại mũi tên: tương ứng dữ liệu, kiểm soát và phụ thuộc địa chỉ. Chương trình 'int a, b, * p; void main (int x, int y, int z) { p = & a; * p = x; nếu (y) b = z; } 'chứa tất cả 3 loại phụ thuộc. Sử dụng các dòng lệnh giống như trong ví dụ đầu tiên, bạn sẽ không gặp khó khăn khi nhận ra cái nào. Không có mô tả người dùng có sẵn về nội bộ của slicer, xin lỗi, chỉ mô tả bên ngoài về cách sử dụng nó. –

+1

Tôi nghĩ rằng nó phải là '-pdg-dot' hơn là' -dot-pdg' phải không? Ít nhất đối với tôi nó chỉ làm việc theo cách cũ – Paddre

4

Nếu bạn muốn trực quan hóa các phụ thuộc của các phương pháp gọi nhau và đang sử dụng gcc thì tùy chọn gcc của -fdump-rtl-expand có thể bạn quan tâm.

Đối với mỗi tệp nguồn bạn biên dịch bằng tùy chọn -fdump-rtl-expandgcc sẽ xuất ra tệp *.expand.

Các tệp đó được cấp cho công cụ egypt tạo (các) biểu đồ hiển thị phụ thuộc của phương thức.

+0

Một PDG là một đồ thị có các nút là các câu lệnh. Xem ví dụ http://www.grammatech.com/research/papers/slicing/slicingWhitepaper.html –

Các vấn đề liên quan