The (chấp nhận) proposal for "Runtime-sized arrays with automatic storage duration (N3639)" khẳng định rằngLàm thế nào khó khăn là phát hiện cấp nguồn của mảng giới hạn thời gian chạy?
stack overflow trở nên nhiều khả năng, đặc biệt là nếu kích thước phụ thuộc vào đầu vào bên ngoài và không được kiểm tra đúng cách. Một số môi trường có thể cấm sử dụng tính năng này. Việc cấm như vậy có thể được thực thi dễ dàng bằng công cụ phân tích tĩnh.
Tôi không coi việc thực thi trở nên dễ dàng nếu yêu cầu trình phân tích triển khai trình biên dịch C++ đầy đủ.
Xét đoạn mã sau:
template<typename T>
inline void array_user(const T& x)
{
int a[f(traits<T>::omega)];
}
Có vẻ với tôi như phân tích cần phải được lặp đi lặp lại cho mỗi lần sử dụng của array_user<T>
và xem xét:
- chuyên ngành áp dụng của
traits<T>
phát hiện tại thời điểm sử dụngarray_user<T>
- Cho dù
traits<T>::omega
là biểu thức hằng số biên dịch theo thời gian (hoặc quaconstexpr
hoặc C++ 03 cách tiếp cận nhưenum
) - Loại
traits<T>::omega
- Cho dù tình trạng quá tải hiện hành của
f()
(tại thời điểm sử dụngarray_user<T>
và có thể tìm thấy qua ADL) làconstexpr
Tôi có thiếu cái gì? Có thể thực thi một hạn chế như vậy mà không phải trải qua quá trình biên dịch đầy đủ không?
Có thể viết mã theo cách như vậy để đơn giản hóa việc xác minh không sử dụng giới hạn thời gian chạy không?
Xét rằng [N3652 làm cho hầu như mọi thứ hợp pháp trong các hàm 'constexpr' trong C++ 1y] (http://isocpp.org/files/papers/N3652.html), việc viết một trình phân tích tĩnh chung sẽ yêu cầu bạn triển khai một thông dịch viên cũng như một trình biên dịch. – Casey
@Casey: Có đảm bảo rằng mọi hàm 'constexpr' sẽ trả về hằng số biên dịch nếu các tham số của nó là các hằng số biên dịch thời gian? Hoặc nó có thể phụ thuộc vào chuyên môn của các mẫu được tiêu thụ (có thể gián tiếp) bởi hàm 'constexpr' không? Tôi vẫn cảm thấy như vậy có thể được xác định thông qua phân tích kiểu, mà không thực sự tính toán kết quả của hàm 'constexpr' (và tất cả các thực thi đòi hỏi) –
Tôi không lo lắng về một máy phân tích tĩnh chung cho các mục đích của câu hỏi này, một để phát hiện việc sử dụng giới hạn thời gian chạy. –