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.dot
và graph.f.dot
chứa PDG của main()
và 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:
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;
}
Nguồn
2012-03-21 22:36:39
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
@ 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ó. –
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