2013-08-01 28 views
6

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ụng array_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 qua constexpr 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ụng array_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?

+1

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

+0

@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) –

+0

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. –

Trả lời

1

Nếu tôi được giao nhiệm vụ viết một bộ phân tích để xác minh tĩnh không sử dụng giới hạn thời gian chạy, tôi sẽ từ chối mã trên. Tôi sẽ yêu cầu tất cả các khai báo mảng để sử dụng một chữ không thể thiếu cho ràng buộc hoặc được chú thích để có trình biên dịch từ chối các giới hạn thời gian chạy.

template<typename T> 
inline void array_user(const T& x) 
{ 
    int a[f(traits<T>::omega)]; 
    sizeof a; 
} 

Tuy nhiên, do số lượng các trình biên dịch rằng hiện đang cung cấp C99-style Vlas trong ++ chế độ C như một phần mở rộng, tôi không tự tin rằng họ sẽ thực sự phù hợp với các hành vi C++ 14 cấm sizeof.

+1

Clang/gcc cho phép 'decltype' cho VLAs, và clang cũng cho phép' typeinfo() '. Tôi nghĩ rằng khấu trừ mẫu là cách duy nhất để buộc giới hạn tĩnh dễ dàng hoạt động trong các trình biên dịch ngày nay ([ví dụ] (http://coliru.stacked-crooked.com/view?id=8f37bb9c196e4b0e360d60ead3e03eae-e1204655eaff68246b392dc70c5a32c9)). – Casey

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