forge_lint/sol/info/
unsafe_cheatcodes.rs1use 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] = &[
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(callee, _) = &expr.kind
30 && let ExprKind::Member(_, member) = &callee.kind
31 && UNSAFE_CHEATCODES.contains(&member.as_str())
32 {
33 ctx.emit(&UNSAFE_CHEATCODE_USAGE, member.span);
34 }
35 }
36}