2010-04-16 31 views
9

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?

Trả lời

3

Tôi không nghĩ rằng tùy chọn/tính năng đó tồn tại trong gcc/g ++. Ví dụ:

Ví dụ: tất cả biến toàn cầu (và tĩnh) nằm trong phần .bss, luôn được khởi tạo thành số không. Tuy nhiên, những cái chưa được khởi tạo được đặt trong một phần đặc biệt trong số .bss, vì mục đích tương thích.

Nếu bạn muốn chúng được đặt 0, bạn có thể chuyển đối số -fno-common cho trình biên dịch. Hoặc, nếu bạn cần nó trên cơ sở mỗi biến, hãy sử dụng __attribute__ ((nocommon)).

Đối với heap, bạn có thể viết trình phân bổ của riêng mình để hoàn thành những gì bạn đã mô tả. Nhưng đối với ngăn xếp, tôi không nghĩ rằng có một giải pháp dễ dàng.

+0

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 đó. –

1

Tôi không tin rằng g ++ sẽ phát hiện tất cả các trường hợp như thế này, nhưng chắc chắn sẽ là Valgrind.

+0

Có, các công cụ phân tích khác dường như là giải pháp. Dường như một cái gì đó trình biên dịch có thể sắp xếp, nhưng không quá ngạc nhiên nếu nó không. –

4

Bất kỳ C++ comiler có thể khởi tạo bất kỳ loại POD đến giá trị của nó "không" bằng cách sử dụng cú pháp:

int i = int(); 
float f = float(); 
MyStruct mys = MyStruct(); 
// and generally: 
T t = T(); 

Nếu bạn muốn nói về gỡ lỗi đó là cái gì khác ...

(By the way , Tôi nghĩ VS có tất cả bộ nhớ chưa khởi tạo được khởi tạo thành 0xCC khi ở chế độ gỡ lỗi, vì vậy không có vấn đề gì khi bạn nhảy (ví dụ: gọi con trỏ hàm xấu) không phải là mã chương trình/dữ liệu thực tế int3.)

+4

Hoặc, đối với những người từ lâu làm cho C++ trông giống như Lisp, 'T t ((T()))' :-) –

+1

@James: Bạn hoàn toàn đúng, nhưng cú pháp này đặt tôi vào tình huống khó xử. Tôi không biết đau hơn khi nhìn vào nó - mắt hay trái tim tôi. :) – conio

+0

Có, nó * có thể * khởi tạo, nhưng nó không, vì vậy tôi đoán tôi thực sự nghiêng về phía giúp gỡ lỗi. Âm thanh như giải pháp nằm ngoài g ++, mặc dù (valgrind et.al). –

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