Tôi vừa bị cắn bởi một hành vi không xác định khó chịu do trả về một tham chiếu đến biến cục bộ.Trình biên dịch phát hiện trở về tham chiếu đến biến cục bộ
Chúng tôi biết đó là điều ác, và nói chung trình biên dịch in đẹp warning
để cho chúng tôi biết như vậy ... cũng gcc (3.4.2) dường như không đẩy kiểm tra quá xa.
std::string get_env_value(std::string const& key);
std::string const& get_phase()
{
std::string const& phase = get_env_value("PHASE"); // [1]
std::cout << "get_phase - " << phase << '\n';
return phase; // [2]
}
Biên dịch này không bị trục trặc, nhưng chúng tôi rơi vào vùng khó chịu của hành vi không xác định.
Dòng [1]
là không sao vì tiêu chuẩn xác định rằng tuổi thọ của biến được liên kết với tham chiếu const nên được mở rộng để khớp với thời gian tồn tại của tham chiếu const.
Dòng [2]
có vẻ okay quá ...
- Đừng C++ thông số kỹ thuật bao gồm trường hợp này?
- Có ai biết điều này thường được chẩn đoán không? (Tôi có thể bỏ lỡ một lá cờ hoặc một cái gì đó ...)
Dường như với tôi rằng phân tích tĩnh nên có thể nói rằng có sử dụng một "mở rộng tuổi thọ" cho [1]
, [2]
là không an toàn, nhưng nó có thể nhận được xấu xí nhanh chóng tôi đoán ...
Thiệt hại, đó là một trường hợp khó chịu! –
Cuối cùng, có thể 'get_env_value()' trả về một tham chiếu đến một biến không nằm ngoài phạm vi, ví dụ như toàn cục, trong trường hợp đó mọi thứ sẽ ổn. – UncleBens
@UncleBens: Đó là một điểm tốt – Chubsdad