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'
Trả lời
Đ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
union
làstruct
, 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.
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
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.
- 1. Nhảy hoặc di chuyển có điều kiện phụ thuộc vào giá trị chưa được khởi tạo (01)
- 2. xác định chính xác "nhảy có điều kiện hoặc di chuyển phụ thuộc vào giá trị uninitialized (s)" valgrind tin nhắn
- 3. valgrind Điều kiện nhảy hoặc di chuyển phụ thuộc vào giá trị uninitialised (s), điều này cho thấy rò rỉ bộ nhớ?
- 4. Điều gì có thể được khởi tạo?
- 5. Biến Delphi có thể chưa được khởi tạo cảnh báo
- 6. Phụ thuộc đá quý có điều kiện
- 7. AudioTrack: play() được gọi là AudioTrack chưa được khởi tạo
- 8. Có một khóa băm chưa được khởi tạo có giá trị mặc định bằng 0 trong Perl không?
- 9. maven phụ thuộc có điều kiện
- 10. Có vấn đề về mặt tích cực sai với Valgrind không?
- 11. Windbg Đặt điểm ngắt có điều kiện phụ thuộc vào Ngăn xếp cuộc gọi
- 12. has_many thông qua hủy diệt phụ thuộc vào hiệp hội trong điều kiện ai được gọi là hủy
- 13. CONCAT có điều kiện với các giá trị NULL hoặc rỗng có thể
- 14. Valgrind báo cáo giá trị chưa khởi tạo trên chương trình C trống
- 15. "Điều kiện có điều kiện" trong mệnh đề WHERE (Điều kiện áp dụng nào phụ thuộc vào cờ "chế độ")
- 16. VB.NET 'Nếu' tuyên bố với 'Hoặc' có điều kiện có cả hai mặt được đánh giá?
- 17. Có thể g ++ điền các biến POD chưa được khởi tạo với các giá trị đã biết không?
- 18. Lỗi C#: "Điền: Thuộc tính SelectCommand.Connection chưa được khởi tạo."
- 19. "Sử dụng giá trị chưa được khởi tạo" mặc dù memset
- 20. Lâu đài windor Thêm phụ thuộc có điều kiện
- 21. "có thể không được khởi tạo"
- 22. Matlab Matric có được chuyển giao theo giá trị hoặc thông qua tham chiếu không?
- 23. Có thể tạo một toàn cầu chưa được quét trong application.cfc không?
- 24. tham gia điều kiện mysql phụ thuộc vào một cột
- 25. Các đối tượng giá trị có phải là phụ thuộc hợp lệ cho mẫu thiết kế DI không?
- 26. Có ai biết điều gì có nghĩa là thông điệp ShellHook HSHELL_RUDEAPPACTIVATED?
- 27. một trường dữ liệu maginh adminhtml có phụ thuộc vào nhiều hơn một trường hoặc giá trị không?
- 28. Giá trị của phần tử chưa được khởi tạo trong mảng là gì?
- 29. không có giá trị nào được cung cấp cho một hoặc nhiều thông số bắt buộc
- 30. Phụ thuộc có điều kiện trong Ruby Gemspec
[Đây] (https://bugzilla.redhat.com/show_bug.cgi?id=518247) dương tính giả. – nos
[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
@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