Để bắt đầu, hãy để tôi nói rằng tôi hiểu cách thức và lý do vấn đề tôi mô tả có thể xảy ra. Tôi là một khoa học máy tính lớn, và tôi hiểu tràn/tràn và ký/unsigned số học. (Đối với những người không quen thuộc với chủ đề, Hướng dẫn Mã hóa An toàn của Apple discusses integer overflow một thời gian ngắn.)Cách tốt nhất để xử lý và báo cáo lỗi phân bổ bộ nhớ do tràn số nguyên trong Objective-C?
Câu hỏi của tôi là báo cáo và khôi phục từ một lỗi như vậy khi nó được phát hiện và cụ thể hơn trong trường hợp khung Mục tiêu-C. (Tôi viết và duy trì CHDataStructures.) Tôi có một vài lớp bộ sưu tập phân bổ bộ nhớ để lưu trữ các đối tượng và tự động mở rộng khi cần thiết. Tôi chưa thấy bất kỳ sự cố tràn liên quan đến tràn, có thể vì các trường hợp thử nghiệm của tôi chủ yếu sử dụng dữ liệu sane. Tuy nhiên, với các giá trị không được xác định, mọi thứ có thể phát nổ khá nhanh và tôi muốn ngăn chặn điều đó.
tôi đã xác định được ít nhất hai trường hợp phổ biến nơi này có thể xảy ra:
- Người gọi qua một giá trị rất lớn unsigned (hoặc giá trị ký âm) để
-initWithCapacity:
. - Đủ đối tượng đã được thêm vào làm cho khả năng tự động mở rộng và khả năng phát triển đủ lớn để gây tràn.
Phần dễ dàng là phát hiện xem có xảy ra tràn hay không. (Ví dụ: trước khi cố gắng phân bổ length * sizeof(void*)
byte, tôi có thể kiểm tra xem length <= UINT_MAX/sizeof(void*)
hay không, vì việc thử nghiệm này sẽ có nghĩa là sản phẩm sẽ tràn và có khả năng phân bổ một vùng bộ nhớ nhỏ hơn nhiều so với mong muốn. thay thế.) Phần khó khăn hơn là xác định cách đối phó với nó một cách duyên dáng. Trong kịch bản đầu tiên, người gọi có lẽ được trang bị tốt hơn (hoặc ít nhất là trong tư duy) để đối phó với một thất bại. Kịch bản thứ hai có thể xảy ra ở bất kỳ đâu trong mã mà một đối tượng được thêm vào bộ sưu tập, có thể khá không xác định.
Câu hỏi của tôi, sau đó, là: Làm cách nào để "công dân tốt" Mã mục tiêu-C dự kiến sẽ hoạt động khi số nguyên tràn xảy ra trong loại tình huống này? (Lý tưởng nhất, vì dự án của tôi là một khuôn khổ trong cùng tinh thần như Foundation trong Cocoa, tôi muốn mô hình hóa cách nó hoạt động cho tối đa "phù hợp trở kháng". Tài liệu của Apple tôi đã tìm thấy không đề cập đến nhiều ở tất cả về điều này.) Tôi thấy rằng trong mọi trường hợp, báo cáo lỗi là một lỗi nhất định. Vì các API để thêm một đối tượng (có thể gây ra kịch bản 2) không chấp nhận một tham số lỗi, tôi có thể thực sự làm gì để giúp giải quyết vấn đề, nếu có? Điều gì thực sự được coi là ổn trong những tình huống như vậy? Tôi rất lo lắng khi viết mã dễ bị lỗi nếu tôi có thể làm tốt hơn ...
Hạnh phúc, vì mã được đề cập là khung bộ sưu tập cấp thấp, tôi thực sự không thể lo lắng cụ thể về bất kỳ dữ liệu người dùng nào, vì tôi không biết làm thế nào để tồn tại hoặc kiểm tra tham nhũng. Ở một số nơi mà (2) có thể xảy ra, tôi sẽ lập kế hoạch để làm một cái gì đó thông minh, như cố gắng phân bổ nhỏ hơn (nếu đó là một bộ sưu tập đang phát triển) hoặc trở về nil. Trong mọi trường hợp, tôi chắc chắn sẽ đăng nhập bằng chứng để giúp theo dõi vấn đề. Cảm ơn vì bối cảnh hữu ích cho việc đó. –