pina_lints 0.12.0

Pina's official security lints: a self-contained, Dylint-compatible lint catalog with a built-in rustc driver
// normalize-stderr-test: "\n$" -> ""

#![allow(dead_code)]

struct Account;

mod token {
	pub static ID: [u8; 1] = [1];
}

mod token_2022 {
	pub static ID: [u8; 1] = [2];
}

impl Account {
	fn as_token_mint_for_program(&self, _program: &[u8]) -> Result<(), ()> {
		Ok(())
	}

	fn assert_associated_token_address(
		&self,
		_owner: &[u8],
		_mint: &[u8],
		_program: &[u8],
	) -> Result<(), ()> {
		Ok(())
	}
}

fn process(
	mint: &Account,
	vault: &Account,
	owner: &[u8],
	program: &[u8],
	other_program: &[u8],
) -> Result<(), ()> {
	mint.as_token_mint_for_program(program)?;
	vault.assert_associated_token_address(owner, owner, other_program)
	//~^ ERROR: token operation uses `other_program` after the instruction established `program`
}

fn process_mixed_constants(mint: &Account, vault: &Account, owner: &[u8]) -> Result<(), ()> {
	mint.as_token_mint_for_program(&token::ID)?;
	vault.assert_associated_token_address(owner, owner, &token_2022::ID)
	//~^ ERROR: token operation uses `token_2022::ID` after the instruction established `token::ID`
}

fn process_equivalent_aliases(
	mint: &Account,
	vault: &Account,
	owner: &[u8],
	program: &[u8],
) -> Result<(), ()> {
	let parsing_program = program;
	let cpi_program = parsing_program;
	mint.as_token_mint_for_program(parsing_program)?;
	vault.assert_associated_token_address(owner, owner, cpi_program)
}

fn process_shadowed_program(
	mint: &Account,
	vault: &Account,
	owner: &[u8],
	program: &[u8],
) -> Result<(), ()> {
	mint.as_token_mint_for_program(program)?;
	let program = &token_2022::ID;
	vault.assert_associated_token_address(owner, owner, program)
	//~^ ERROR: token operation uses `token_2022::ID` after the instruction established `program`
}

fn process_reassigned(
	mint: &Account,
	vault: &Account,
	owner: &[u8],
	mut program: &[u8],
) -> Result<(), ()> {
	mint.as_token_mint_for_program(program)?;
	program = &token_2022::ID;
	vault.assert_associated_token_address(owner, owner, program)
	//~^ ERROR: token-program value `program` was reassigned between token operations
}

fn main() {}