2013-02-15 34 views
8

Tôi đang thực hiện phân tích luồng dữ liệu liên thủ tục với tiếng kêu. Hiện tại tôi đang sử dụng libtooling để phân tích cú pháp các tệp nguồn và gọi cho khách truy cập AST. Câu hỏi đặt ra là làm cách nào để tạo một AST cho một số tệp .c?AST cho nhiều tệp nguồn với clang

Tôi đã cố gắng sử dụng lớp ASTImport, nhưng nó không hỗ trợ nhập một số nút AST. Hơn nữa, tôi đang làm một cái gì đó sai khi tôi tạo và thao tác CompilerIstance và nó treo trong destructor.

Một tùy chọn rất giống với ASTImportAction nhưng không rõ ràng đối với tôi thông số dòng lệnh nào nên được chuyển đến ClangTool trong trường hợp này.

Tùy chọn thứ ba là tạo ASTUnits cho mọi tệp .c và tìm định nghĩa trong mỗi tệp. Không rõ cách tìm thư từ giữa các loại xác định người dùng, ví dụ: Hồ sơ. Trong ASTImport họ sử dụng hàm IsStructurallyEquivalent() nhưng nó được khai báo trong không gian tên vô danh vì vậy tôi chỉ có thể sao chép tất cả mã này vào chương trình của tôi. Và một lần nữa nó hỗ trợ không phải tất cả các nút AST.

Từ internet, liên kết này http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.html có vẻ phù hợp nhất nhưng đối với tôi, các chi tiết kỹ thuật của giải pháp không rõ ràng.

Mọi đề xuất đều được hoan nghênh. Rất cám ơn.

+1

Tại sao bạn muốn sản xuất "một" AST cho một số tệp? Tại sao bạn không thể chỉ cần xử lý một AST cho mỗi tệp? –

+1

Tôi muốn ai đó có câu trả lời cho điều này: \ Tôi đang cố gắng làm điều tương tự ngay bây giờ. –

Trả lời

0

Tôi đã cố gắng làm một việc tương tự. Tôi đã không cố gắng tạo ra một AST duy nhất mặc dù. Tôi đã phân tích nhiều AST và cố gắng tự mình lập bản đồ các chức năng. Tôi đang sử dụng các đối sánh AST để nhận các cuộc gọi hàm và sau đó kiểm tra chúng trong các AST khác.

Tôi đang sử dụng tệp compile_commands.json để cung cấp cho danh sách tệp nguồn. OptionsParser.getCompilations() getAllFiles() có thể nhận tất cả các tệp nguồn được chỉ định trong compile_commands.json.

Khi chúng tôi tạo một clangTool và chạy một lối vàoHành động trên công cụ với trình ghép nối của chúng tôi, nó tìm kiếm kết quả phù hợp trong tất cả các tệp nguồn.

Có thể có cách tối ưu hơn để thực hiện việc này. Trong trường hợp một số biết về nó xin vui lòng chỉ ra nó.

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