2012-05-10 29 views
17

IBM AIX xlc trình biên dịch cung cấp một lá cờ mà tạo ra mã để khởi lưu trữ biến cục bộ:Có cờ gcc để khởi tạo bộ nhớ biến cục bộ không?

 initauto=<hh> 
        Initialialize automatic storage to <hh>. <hh> is a 
        hexadecimal value. This generates extra code and 
        should only be used for error determination. 

Tôi nghĩ rằng trình biên dịch MSVC làm điều gì đó tương tự cho debug xây dựng, nhưng ký ức của tôi có thể mơ hồ về điểm này.

Có tùy chọn tương đương cho GCC không?

+0

'-Wextra' là rất tốt cho cơ sở mã mới mà chưa có 3 triệu dòng mã. :) –

+0

Tôi không thể tin rằng khởi tạo được viết "initialialize" trong tài liệu trình biên dịch. –

+0

@AndrewMarshall: Ha! Tôi thậm chí còn không nhận ra điều đó. Nó thực sự được đánh vần theo cách đó, mặc dù xlc đó là khá cũ. [Trợ giúp trực tuyến] hiện tại (http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Fcompiler%2Fref%2Fruoptini.htm) không có lỗi đó. –

Trả lời

10

OK, Câu trả lời hay nhất tôi có thể cung cấp.

http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html nói "không", do thiếu sót. Không có tài liệu về bất cứ điều gì để chèn mã stack-wiping vào đầu ra. Như gần như tôi có thể đoán, cách duy nhất này có thể làm việc, là tiêm một số mã số memset giống như (có lẽ đơn giản như một số hoạt động mov, nhưng dù sao) vào đầu mỗi khung từ vựng được nhúng trong đó biến tự động được tạo. Gần như tôi có thể nói - và tôi là đến nay từ chuyên gia về nội bộ của GCC, nhưng - dường như không có gì là được ghi lại là sẽ làm như vậy.

Ngoài ra, PDF gccint.pdf của GCC Internals (http://gcc.gnu.org/onlinedocs/gccint.pdf) trên trang 361 xác định rằng tên GCC cho bước gọi điều chỉnh con trỏ khung khi nhập vào hàm là prologue. (Tôi không thực sự biết/hiểu rằng điều này áp dụng cho các phạm vi từ vựng khác trong một hàm, tuy nhiên.) Vì điều đó sẽ xảy ra trong tệp Định nghĩa máy (md), bất kỳ tùy chọn nào như vậy sẽ dường như phải được xác định cho Kiến trúc CPU. Tôi chọc vào ViewCVS trực tuyến của họ tại http://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/ và tìm thấy (ít nhất một) bản sao của prologue xung quanh dòng 11,893 của i386.md, sau khi chơi mở rộng tìm kiếm cho chức năng, một vài bước nhảy, dường như không có gì để phát ra mã điều kiện như thế.

Nhưng điều này thứ dưới GCC's-mui xe là kinda gọn gàng ...

+0

Cảm ơn, điều này có vẻ như gần nhất với câu trả lời đúng (hiện tại). Có chắc chắn nhiều chi tiết có thể có liên quan đến việc thực hiện thực tế, chẳng hạn như các mảng chiều dài biến C99, tái sử dụng không gian biến cục bộ và các thứ như 'alloca()'. –

0

C99: Nếu một đối tượng có thời lượng lưu trữ tự động không được khởi tạo rõ ràng, giá trị của nó không xác định.

Đã có một chủ đề về câu hỏi này. What happens to a declared, uninitialized variable in C? Does it have a value?.

+5

Tôi hiểu đặc tả ngôn ngữ không yêu cầu khởi tạo biến có thời lượng lưu trữ tự động. Tuy nhiên, ít nhất một trình biên dịch có tùy chọn * để làm như vậy nếu bạn yêu cầu. Câu hỏi của tôi là liệu GCC có một lựa chọn tương tự hay không. –

3

Tôi không thể tìm thấy bất kỳ tham chiếu dứt khoát nào, nhưng có vẻ như một số bản sao GCC nhất định (đặc biệt là trình biên dịch GCC Fortran) có tùy chọn -finit-local-zero để tự động đặt bất kỳ biến hoặc mảng cục bộ không được khởi tạo không rõ ràng.

Theo tiêu chuẩn GCC đi, tính năng duy nhất về chủ đề này mà tôi có thể tìm thấy là -Wuninitialized để cảnh báo về bất kỳ biến chưa được khởi tạo nào (mặc dù tôi biết đây không phải là những gì bạn đang tìm kiếm).

Bạn cần điều này bao nhiêu? Nếu bạn có một lý do thực sự tốt, tôi cho rằng không khó để sao chép mã -finit-local-zero vào phiên bản GCC của bạn ...

+0

Nó đã được bản địa hóa cho giao diện người dùng FORTRAN, tuy nhiên: http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html ... tìm kiếm tốt, nhưng tôi e rằng nó sẽ không trợ giúp với mã C-based – BRFennPocock

+2

Đây không phải là một nhu cầu rất lớn vào lúc này. Ý tưởng là nếu chúng ta bật tùy chọn này cho xlc (với cơ sở mã 3+ triệu dòng này), và sau đó được chuyển sang gcc sau, mã có thể dựa vào việc khởi tạo xác định mà sẽ không xảy ra nếu không có tùy chọn tương ứng trong gcc . Lý tưởng nhất, giải pháp dài hạn là sử dụng '-Wuninitalized' với' -Werror' (xlc có các tùy chọn tương đương cho điều đó). –

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