2010-04-08 41 views
12

Đúng như dự đoán, trình biên dịch (VisualStudio 2008) sẽ đưa ra một cảnh báoChức năng với giá trị trả về mất tích, hành vi trong thời gian chạy

cảnh báo C4715: 'doSomethingWith': không tất cả các con đường kiểm soát trả về một giá trị

khi biên dịch đoạn mã sau:

int doSomethingWith(int value) 
{ 
    int returnValue = 3; 
    bool condition = false; 

    if(condition) 
     // returnValue += value; // DOH 

    return returnValue; 
} 

int main(int argc, char* argv[]) 
{ 
    int foo = 10; 
    int result = doSomethingWith(foo); 
    return 0; 
} 

Nhưng chương trình chỉ chạy tốt. Giá trị trả về của hàm doSomethingWith() là 0.

Chỉ là hành vi không xác định, hoặc có một quy tắc nhất định như thế nào giá trị kết quả được tạo ra/được tính khi chạy. Điều gì sẽ xảy ra với các kiểu dữ liệu không phải POD dưới dạng giá trị trả về?

+1

Hãy xem câu trả lời này: http://stackoverflow.com/questions/1610030/why-can-you-return-from-a-non-void-function-without-returning-a-value- không-pro/1610454 # 1610454 –

+0

@fnieto: Ah, tôi hiểu rồi, đây là một câu trả lời rất hay. Đã không tìm thấy nó bản thân mình mặc dù, trước khi yêu cầu ... – nabulke

Trả lời

17

Đó là hành vi Không xác định theo quy định tại các tiêu chuẩn ISO C++ phần tiêu chuẩn 6.6.3:

chảy ra khỏi cuối của một hàm là tương đương với một sự trở lại không có giá trị; kết quả này trong hành vi không xác định trong một hàm trả về giá trị.

+2

Từ cụ thể: - Chảy ra khỏi cuối của một hàm tương đương với một 'trả về' không có giá trị; điều này dẫn đến hành vi không xác định trong hàm trả về giá trị. – kennytm

+1

Chức năng 'chính' là một ngoại lệ đối với quy tắc đó. Trong mã nabulke, dòng chức năng 'chính' cuối cùng là thừa. –

+0

Khi thêm _important_ vào câu trả lời này, trạng thái 3.6.1/5: "Nếu điều khiển đến hết' main' mà không gặp phải câu lệnh 'return', hiệu ứng là việc thực thi' return 0; '". –

2

Không trả lại giá trị từ hàm trả lại giá trị dẫn đến hành vi không xác định.

7

Đối với bộ xử lý x86, quy ước gọi điện thoại chuẩn đặt giá trị trả về cho thanh ghi EAX. Thực tế nó có nghĩa là đối với hầu hết các trình biên dịch nếu chúng ta đạt đến kết thúc của hàm mà không trả về, kết quả của phép toán cuối cùng sẽ được trả về. Tuy nhiên, bạn không thể dựa vào nó và nó không phải là di động.

http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

+0

Thú vị khi biết! Chúng tôi thực sự đã có một chức năng thiếu một sự trở lại đã được đi qua một bài kiểm tra vì điều đó. –

3

Cập nhật @piotr answer.

Từ C++17 Standard Mục 9.6.3

chảy ra khỏi cuối của một constructor, destructor, hoặc một chức năng với một cv trống kiểu trả về là tương đương với một lợi nhuận không có toán hạng. Nếu không, hãy thoát khỏi đầu của một chức năng khác với kết quả chính (6.6.1) trong hành vi không xác định.

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