2010-03-11 43 views
12

Có thể đưa GCC vào một vòng lặp vô hạn bằng cách nhập mã nguồn lạ? Và nếu có, làm thế nào? Có lẽ người ta có thể làm điều gì đó với Template Metaprogramming?Có thể đưa GCC vào vòng lặp vô hạn không?

+1

Tôi khuyên bạn nên sử dụng wiki cộng đồng cho việc này. Tôi có khả năng chỉnh sửa nên sẽ tự thiết lập nếu không có đối tượng nào. – Joshua

+6

@Joshua: Tại sao cộng đồng wiki? Nó không có vẻ chủ quan đối với tôi. Hoặc là có thể, hoặc nó không phải là. –

+4

Nếu có, nó sẽ được gửi đến http://gcc.gnu.org/bugs/ nơi nó có thể được sửa chữa. – ephemient

Trả lời

7

Lỗi đặc biệt thoáng qua, ví dụ như câu trả lời của @ Pestilence được tìm thấy trong GCC 4.4.0 và được khắc phục trong 4.4.1. Để biết danh sách hiện tại cách mang GCC đến vòng lặp vô hạn, hãy kiểm tra their Bugzilla.

CHỈNH SỬA: Tôi vừa tìm thấy một cách mới, cũng làm hỏng Comeau. Đây là một câu trả lời thỏa mãn hơn, ngay bây giờ. Tất nhiên, nó should also be fixed soon.

template< int n > 
struct a { 
    a< n+1 > operator->() { return a< n+1 >(); } 
}; 

int main() { 
    a<0>()->x; 
} 
+0

Tôi thích câu trả lời đó. Tôi sẽ đợi nếu có thêm một số nữa, nhưng có lẽ tôi sẽ chấp nhận nó) –

0

Tôi nghĩ bạn có thể làm điều đó với #include

Chỉ cần #include "file1.c" vào file2.c và #include "file2.c" trong file1

gợi ý gây biên dịch để lặp rất nhiều sau đó thất bại, không lặp vô hạn

+1

Điều đó có thể dễ dàng kiểm tra, phải không? –

+0

Không phát hiện sự phụ thuộc vòng tròn. – NomeN

+0

gcc cuối cùng sẽ không thành công với lỗi '#include lồng nhau quá sâu ', do đó không phải là vòng lặp vô hạn. Một thử nghiệm nhanh chóng cho thấy điều này là đúng. gcc không phát hiện sự phụ thuộc vòng tròn (gcc trên OS X Snow Leopard), nhưng nó không phải là vô hạn –

1

Điều đó có thể xảy ra. Nhưng hầu hết các trình biên dịch (và hầu hết các ngôn ngữ tiêu chuẩn hóa) đều có giới hạn về những thứ như độ sâu đệ quy trong các khuôn mẫu hoặc bao gồm các tệp, tại thời điểm đó trình biên dịch nên giải cứu bằng một chẩn đoán. Các trình biên dịch không thực hiện điều này thường không phổ biến với người dùng.

0

Không biết về gcc, nhưng pcc cũ được sử dụng để đi vào một vòng lặp vô hạn biên dịch một số loại vòng vô hạn (những cái biên dịch xuống _x: jmp _x).

11

Có.

Hầu như mọi chương trình máy tính đều có sự cố chấm dứt vòng lặp. Tôi nghĩ rằng GCC, tuy nhiên, sẽ hết RAM trước khi một vòng lặp vô hạn bao giờ trở nên rõ ràng. Không có nhiều hoạt động "miễn phí" trong thiết kế của nó.

Trình phân tích cú pháp & bộ xử lý trước sẽ không tạo ra sự cố. Tôi sẵn sàng đặt cược rằng bạn có thể nhắm mục tiêu trình tối ưu hóa, có khả năng sẽ có nhiều lỗi triển khai hơn. Nó sẽ ít hơn về ngôn ngữ và nhiều hơn nữa về khai thác một lỗ hổng mà bạn có thể khám phá từ mã nguồn. tức là việc khai thác sẽ không rõ ràng.

CẬP NHẬT

Trong this particular case, lý thuyết của tôi có vẻ đúng. Trình biên dịch giữ phân bổ RAM và trình tối ưu hóa dường như là dễ bị tổn thương. Câu trả lời là có. Có bạn có thể.

+3

Nhận xét về '/ * Về mặt lý thuyết có thể, nhưng * rất cao * không chắc. */'trong báo cáo lỗi đó đáng giá hàng nghìn bức ảnh. –

0

Bentley viết trong cuốn sách của ông "Pearls trình" rằng đoạn mã sau dẫn đến một vòng lặp vô hạn trong biên soạn được tối ưu hóa:

void traverse(node* p) { 
    traverse(p->left); 
    traverse(p->right); 
} 

Ông nói rằng "tôi ưu hoa cố gắng để chuyển đổi đuôi đệ quy vào một vòng lặp, và qua đời khi nó có thể tìm thấy một thử nghiệm để chấm dứt vòng lặp. " (p.139) Anh ta không báo cáo phiên bản trình biên dịch chính xác ở nơi đã xảy ra. Tôi giả định trình biên dịch mới hơn phát hiện các trường hợp.

+0

Không có vòng lặp vô hạn nào trong quá trình biên dịch trên trình biên dịch của tôi (GCC 4.x): ( –

4

Vì lập trình meta mẫu C++ thực tế là hoàn tất bạn có thể tạo một trình biên dịch không bao giờ kết thúc.

Ví dụ:

template<typename T> 
struct Loop { 
    typedef typename Loop<Loop<T> >::Temp Temp; 
}; 

int main(int, char**) { 
    Loop<int> n; 
    return 0; 
} 

Tuy nhiên, giống như câu trả lời trước mắt tôi. gcc có một lá cờ để ngăn chặn điều này tiếp tục vô tận (Giống như một tràn ngăn xếp trong một đệ quy vô hạn).

+0

Hmm. người đàn ông gcc' nó có tùy chọn xác định kích thước tối đa của 'stack'. Vì vậy, nó là không thể vì nó không có cách nào để làm việc xung quanh độ mịn của các lần lặp lại. –

+0

'' chiều sâu instantiation mẫu vượt quá tối đa 500' –

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