E0515
Rust Programming Language
Severity: CriticalWhat Does This Error Mean?
You tried to return a reference to a value that is created inside the function. When the function ends, that value is dropped — leaving the reference dangling. Return the owned value instead, or store it somewhere with a longer lifetime.
Affected Models
- Rust stable
- Rust nightly
- Cargo build
- Rust 2021 edition
Common Causes
- Returning a reference to a String created inside the function
- Returning a reference to a Vec or other heap value created locally
- Returning a reference to a local variable from a block or loop
- Creating a temporary value inside the function and returning a reference to it
- Building a value with a method chain and returning a reference to an intermediate result
How to Fix It
-
Return the owned value directly instead of a reference to it.
Change fn get_name() -> &String to fn get_name() -> String and return the owned String.
-
If you must return a reference, accept the data as a parameter and return a reference to it.
fn first_word(s: &str) -> &str — the reference returned borrows from the input, which lives long enough.
-
For string data, return &'static str if the value is a string literal known at compile time.
fn greeting() -> &'static str { 'Hello' } — string literals live for the entire program duration.
-
Use Rc or Arc to share ownership of the value across caller and callee.
Return Rc<String> instead of &String — the caller and function both hold a reference-counted pointer to the data.
-
Restructure so the value is created by the caller and passed into the function.
Instead of the function creating and returning the value, have the caller provide a buffer that the function fills.
When to Call a Professional
E0515 is a critical safety error that Rust catches at compile time. In C or C++, this compiles but causes undefined behaviour — a serious security vulnerability. Fix it yourself by returning the owned value instead of a reference.
Frequently Asked Questions
Why does Rust prevent returning references to local variables?
When a function returns, all its local variables are dropped and their memory is freed. A reference to that memory would be a dangling pointer — pointing to freed memory. In C, this compiles silently and causes undefined behaviour or security vulnerabilities. Rust prevents it entirely.
What does a dangling reference mean in practice?
A dangling reference points to memory that has been freed. Reading it returns garbage data or crashes the program. Writing to it corrupts memory — a common source of security vulnerabilities in C programs. Rust makes it impossible to create dangling references.
What is the 'static lifetime and when should I use it?
The 'static lifetime means the data lives for the entire duration of the program. String literals like 'hello' have 'static lifetime — they are baked into the binary. Use 'static only for data that genuinely outlives all functions — not as a workaround for lifetime errors.