Tôi biết rằng Visual Studio dưới tùy chọn gỡ lỗi sẽ lấp đầy bộ nhớ với một giá trị đã biết. G ++ (bất kỳ phiên bản nào, nhưng gcc 4.1.2 là thú vị nhất) có bất kỳ tùy chọn nào có thể điền vào cấu trúc POD chưa được khởi tạo với các giá trị dễ nhận biết không?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?
struct something{ int a; int b; };
void foo() {
something uninitialized;
bar(uninitialized.b);
}
Tôi mong đợi uninitialized.b
là ngẫu nhiên không thể đoán trước được; rõ ràng một lỗi và dễ dàng tìm thấy nếu tối ưu hóa và cảnh báo được bật. Nhưng chỉ được biên soạn với -g, không có cảnh báo . Một đồng nghiệp đã có một trường hợp mã tương tự với điều này làm việc vì nó tình cờ có giá trị hợp lệ; khi trình biên dịch nâng cấp, nó bắt đầu thất bại. Ông nghĩ đó là vì trình biên dịch mới đã chèn các giá trị đã biết vào cấu trúc (nhiều cách mà VS điền 0xCC). Theo kinh nghiệm của riêng tôi, nó chỉ khác nhau giá trị ngẫu nhiên không xảy ra hợp lệ.
Nhưng bây giờ tôi tò mò - có bất kỳ thiết lập nào của g ++ mà có thể làm cho nó lấp đầy bộ nhớ mà tiêu chuẩn nói cách khác không nên được khởi tạo không?
Tôi không nghĩ rằng tính năng này tồn tại, nhưng hướng dẫn sử dụng gcc dài và sâu, và tôi đã rất ngạc nhiên trước những gì ẩn giấu trong đó. –