Skip to main content

Panic error

What it does

The panic! macro is used to stop execution when a condition is not met. This is useful for testing and prototyping, but should be avoided in production code.

Why is this bad?

The usage of panic! is not recommended because it will stop the execution of the caller contract.

Known problems

While this linter detects explicit calls to panic!, there are some ways to raise a panic such as unwrap() or expect().

Example

// example code where a warning is issued
pub fn add(&mut self, value: u32) {
match self.value.checked_add(value) {
Some(v) => self.value = v,
None => panic!("Overflow error"),
};
}

Here is an example of code that does not raise a warning:

#[derive(Debug, PartialEq, Eq, scale::Encode, scale::Decode)]
#[cfg_attr(feature = "std", derive(scale_info::TypeInfo))]
pub enum Error {
/// An overflow was produced while adding
OverflowError,
}

pub fn add(&mut self, value: u32) -> Result<(), Error> {
match self.value.checked_add(value) {
Some(v) => self.value = v,
None => return Err(Error::OverflowError),
};
Ok(())
}

Implementation

The detector's implementation can be found at this link.