forge_lint/sol/info/
unsafe_cheatcodes.rs

1use super::UnsafeCheatcodes;
2use crate::{
3    linter::{EarlyLintPass, LintContext},
4    sol::{Severity, SolLint},
5};
6use solar::ast::{Expr, ExprKind};
7
8declare_forge_lint!(
9    UNSAFE_CHEATCODE_USAGE,
10    Severity::Info,
11    "unsafe-cheatcode",
12    "usage of unsafe cheatcodes that can perform dangerous operations"
13);
14
15const UNSAFE_CHEATCODES: [&str; 9] = [
16    "ffi",
17    "readFile",
18    "readLine",
19    "writeFile",
20    "writeLine",
21    "removeFile",
22    "closeFile",
23    "setEnv",
24    "deriveKey",
25];
26
27impl<'ast> EarlyLintPass<'ast> for UnsafeCheatcodes {
28    fn check_expr(&mut self, ctx: &LintContext, expr: &'ast Expr<'ast>) {
29        if let ExprKind::Call(lhs, _args) = &expr.kind
30            && let ExprKind::Member(_lhs, member) = &lhs.kind
31            && UNSAFE_CHEATCODES.iter().any(|&c| c == member.as_str())
32        {
33            ctx.emit(&UNSAFE_CHEATCODE_USAGE, member.span);
34        }
35    }
36}