2011-12-08 26 views
9

Hầu hết các câu hỏi tôi tìm thấy ở đây cung cấp một đoạn mã và được trả lời bởi ai đó trỏ đến lỗi thực tế. Câu hỏi của tôi là về nhảy có điều kiện về giá trị uninitialized nói chung. Tôi có thể hiểu rằng một phần của bộ nhớ không nhất thiết phải được làm sạch ở cuối chương trình nếu người ta chắc chắn rằng việc phân bổ này chỉ được thực hiện một lần và có thể sẽ cần thiết trong suốt thời gian tồn tại của một chương trình. Theo như tôi nhớ hệ thống GType để lại rất nhiều bộ nhớ không xác định khi chương trình kết thúc. Những khối không xác định này có thể được xem là 'dương tính giả'. Nhưng liệu 'nhảy có điều kiện hoặc di chuyển trên giá trị chưa được khởi tạo' có phải là dương tính giả không? Điều duy nhất tôi có thể nghĩ ra là ai đó đang thực hiện một hàm ngẫu nhiên (xấu) bằng cách chỉ đọc một địa chỉ ngẫu nhiên (nơi mà địa chỉ ngẫu nhiên chính là phần khó hiểu;). Một ví dụ khác có thể là phần cứng ánh xạ tới một phần của bộ nhớ mà sau đó được đọc, nhưng điều này chủ yếu được thực hiện bởi các trình điều khiển chứ không phải bởi các ứng dụng người dùng bình thường. Có ví dụ nào khác (tốt nhất là C) có thể gây ra dương tính giả không?Có một thông điệp valgrind "nhảy có điều kiện hoặc di chuyển phụ thuộc vào giá trị chưa được khởi tạo" có thể được gọi là 'sai dương'

+1

[Đây] (https://bugzilla.redhat.com/show_bug.cgi?id=518247) dương tính giả. – nos

+0

[Tôi có nên lo lắng về "Nhảy hoặc điều kiện có điều kiện phụ thuộc vào giá trị uninitialised (s)"?] (Http://stackoverflow.com/questions/765913/) từ "bên liên quan" cho thấy (sau khi tất cả các chỉnh sửa) rất mã đơn giản mà tạo ra lỗi này và Jared whys và wherefores. – dmckee

+0

@dmckee Tôi đã nhanh chóng đọc chủ đề đó và chỉ có thể tìm thấy câu trả lời của người đăng tải vấn đề của mình. Tôi không thấy một dương tính giả ở đó. – LittleFunnyMan

Trả lời

6

Điều valgrind báo cáo là nó nhìn thấy một bước nhảy dựa trên thông tin được đọc từ một vị trí mà nó biết rằng chương trình đã được chương trình phân bổ nhưng chưa được xem khởi tạo. Điều này có thể xảy ra nếu đối tượng được khởi tạo bởi một số phép thuật mà valgrind không biết. Kiến trúc phát triển liên tục và có thể bạn có một hướng dẫn hoặc loại đăng ký mà valgrind không biết đủ về.

Một nguồn khó khăn khác của việc không khởi tạo như vậy là union s. Hai nguồn:

  • mỗi mặc định, đối với những chỉ thành viên đầu tiên được khởi tạo và do đó khi lĩnh vực khác vượt xa mà thành viên đầu tiên mà một phần có thể là uninitialized.
  • Nếu các thành viên của unionstruct, họ có thể có đệm byte tại các địa điểm khác nhau và do đó một phần của thành viên có thể là chưa được khởi tạo nếu bạn được chỉ định cho một thành viên khác.

Trong một số trường hợp, bạn có thể đọc những điều này (ví dụ: unsigned char[]) vì vậy nếu bạn coi những lỗi như vậy (sai dương) hay không là vấn đề quan điểm.

+1

Cảm ơn - bằng cách sử dụng 'memcmp' trên cấu trúc đệm đã cho tôi chính xác vấn đề này! – Alnitak

4

Tuyệt đối! Tôi đã từng có mã C có dạng

// compute a and, possibly, b 
if (a && b) { 
    // do stuff 
} 

trong đó b được đảm bảo để được khởi tạo nếu a là đúng. Vì vậy, không có cách nào mà một giá trị uninitialized b có thể gây ra một vấn đề. Tuy nhiên, gcc, khi tối ưu hóa đủ mạnh, quyết định kiểm tra giá trị b trước tiên. Điều này đã được chấp nhận vì không kiểm tra có bất kỳ tác dụng phụ nào, nhưng nó vẫn gây ra valgrind để khiếu nại.

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