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; 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}