2010-05-21 29 views
21

Giả sử tôi muốn có loại giá trị là 7 byte (hoặc 3 hoặc 777).Tại sao bộ đệm kích thước cố định (mảng) phải không an toàn?

tôi có thể định nghĩa nó như thế:

public struct Buffer71 
{ 
    public byte b0; 
    public byte b1; 
    public byte b2; 
    public byte b3; 
    public byte b4; 
    public byte b5; 
    public byte b6; 
} 

Một cách đơn giản để định nghĩa nó là sử dụng một bộ đệm cố định

public struct Buffer72 
{ 
    public unsafe fixed byte bs[7]; 
} 

Tất nhiên định nghĩa thứ hai là đơn giản hơn. Vấn đề nằm ở từ khóa không an toàn phải được cung cấp cho bộ đệm cố định. Tôi hiểu rằng điều này được thực hiện bằng cách sử dụng con trỏ và do đó không an toàn.

Câu hỏi của tôi là tại sao nó phải không an toàn? Tại sao C# không thể cung cấp các mảng chiều dài không đổi tùy ý và giữ chúng như một loại giá trị thay vì biến nó thành mảng kiểu tham chiếu C# hoặc bộ đệm không an toàn?

Trả lời

13

Bởi vì "bộ đệm cố định" không phải là một mảng thực. Nó là một loại giá trị tùy chỉnh, về cách duy nhất để tạo ra một trong ngôn ngữ C# mà tôi biết. Không có cách nào để CLR xác minh rằng việc lập chỉ mục của mảng được thực hiện một cách an toàn. Mã không thể xác minh được. Bản trình diễn đồ họa nhất về điều này:

using System; 

class Program { 
    static unsafe void Main(string[] args) { 
     var buf = new Buffer72(); 
     Console.WriteLine(buf.bs[8]); 
     Console.ReadLine(); 
    } 
} 
public struct Buffer72 { 
    public unsafe fixed byte bs[7]; 
} 

Bạn có thể tùy ý truy cập khung ngăn xếp trong ví dụ này. Kỹ thuật phun tràn bộ đệm tiêu chuẩn sẽ có sẵn cho mã độc để vá địa chỉ trả về hàm và buộc mã của bạn chuyển đến vị trí tùy ý.

Vâng, điều đó khá không an toàn.

+11

Vì vậy, vấn đề đơn giản là CIL thiếu phương tiện thực hiện các hoạt động được lập chỉ mục bị chặn? Tôi không thấy bất kỳ lý do ngữ nghĩa nào tại sao CIL không thể cung cấp một tính năng như vậy. Một số thứ như chuyển đổi đồ họa có thể hơi hơn một chút so với kích thước 16 byte "lý tưởng" của một cấu trúc, nhưng chúng nên có một ngữ nghĩa có giá trị thay đổi một cách hợp lý. Các ngữ nghĩa không thể thay đổi làm cho việc điều chỉnh giá trị trong một trường hợp trở nên khó khăn và các ngữ nghĩa tham chiếu có thể thay đổi giới thiệu sự mơ hồ như khi nào, ví dụ: một hàm trả về một cá thể sẽ trả về một cá thể mới hoặc một cá thể hiện có. – supercat

+0

Nó không đơn giản như vậy nó làm tăng rất nhiều vấn đề liên quan đến bảo đảm an toàn đồng thời. – user1496062

+1

Thật điên rồ khi không có cách nào * an toàn * để nhúng một mảng có kích thước cố định vào một cấu trúc. Đối với phần hiệu suất cao của mã tôi muốn sử dụng khá nhiều chỉ 100% blittable cấu trúc. Ít nhất chúng ta có ref ref và refals người dân bây giờ. – JBeurer

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