| Crates.io | construstor |
| lib.rs | construstor |
| version | 0.2.1 |
| created_at | 2025-07-13 13:13:43.596295+00 |
| updated_at | 2025-08-03 23:53:58.058678+00 |
| description | A tool for analyzing Solidity smart contracts to detect zero address validation patterns |
| homepage | |
| repository | https://github.com/oakenknight/construstor |
| max_upload_size | |
| id | 1750499 |
| size | 64,080 |
A tool for analyzing Solidity smart contracts to detect zero address validation patterns in constructors, initialize functions, and all functions with address parameters.
.sol files--all-functions flagaddress[], address[] memory, address[] calldata)== address(0), != address(0))require() statements with zero address validation--json)--summary)git clone https://github.com/oakenknight/construstor.git
cd construstor
cargo build --release
cargo install construstor
The binary will be available at target/release/construstor.
Run the tool with a file or directory:
# Analyze only constructors and initialize functions (default)
construstor MyContract.sol
# Analyze ALL functions with address parameters
construstor MyContract.sol --all-functions
# Output in JSON format
construstor MyContract.sol --json
# Show only summary statistics
construstor MyContract.sol --summary
# Combine flags
construstor MyContract.sol --all-functions --json
# Interactive mode (will prompt for path)
construstor
--all-functions / -a: Analyze all functions with address parameters, not just constructors and initialize functions--json / -j: Output results in JSON format (excludes code for cleaner output)--summary / -s: Show only summary statistics--help / -h: Display help information--version / -V: Display version informationConstructor and Initialize Functions (Default):
Constructor in MyContract.sol:
๐ Found 2 address argument(s): address _owner, address _manager
โ
Zero address validation found:
โข Direct address(0) comparison
โข require() statement with zero address check
โ Checking variable: _owner
โ Checking variable: _manager
โ
All address arguments are validated!
Arguments: address _owner, address _manager
Code:
constructor(address _owner, address _manager) {
require(_owner != address(0), "Owner cannot be zero address");
require(_manager != address(0), "Manager cannot be zero address");
owner = _owner;
manager = _manager;
}
All Functions Analysis (--all-functions):
Function 'setTokens' in MyContract.sol:
๐ Found 3 address argument(s): address _token, address[] memory _addresses, address _fallback
โ
Zero address validation found:
โข require() statement with zero address check
โ Checking variable: _token
โ Missing zero address validation for:
โ ๏ธ Argument: _addresses
โ ๏ธ Argument: _fallback
Arguments: address _token, address[] memory _addresses, address _fallback
Code:
function setTokens(address _token, address[] memory _addresses, address _fallback) {
require(_token != address(0), "Token cannot be zero");
// Missing validation for _addresses array and _fallback
}
๐ Analysis Summary:
Total functions analyzed: 1
Functions with address arguments: 1
Fully validated: 0
Partially validated: 1
Not validated: 0
JSON Output (--json):
[
{
"function_type": "Constructor",
"file_name": "MyContract.sol",
"arguments": "address _owner, address _manager",
"address_arguments": ["_owner", "_manager"],
"validated_variables": ["_owner", "_manager"],
"missing_validations": [],
"validation_types": ["RequireStatement"]
}
]
Run the test suite:
cargo test
Run tests with verbose output:
cargo test -- --nocapture
constructor(address _owner, address[] memory _tokens) {
require(_owner != address(0), "Owner cannot be zero");
// Missing validation for _tokens array โ
owner = _owner;
tokens = _tokens;
}
function initialize(address _hookManager, address _test) external initializer {
require(_hookManager != address(0), "Hook manager cannot be zero address");
if (_test == address(0)) revert("Test cannot be zero address");
// Both arguments validated โ
}
--all-functions)function setTokenAddresses(
address _primary,
address[] calldata _secondary,
address storage _fallback
) external onlyOwner {
require(_primary != address(0), "Primary cannot be zero");
// Missing validation for _secondary array and _fallback โ
primaryToken = _primary;
secondaryTokens = _secondary;
fallbackToken = _fallback;
}
The tool now recognizes various address parameter types:
address _owneraddress[] _tokens, address[] memory _list, address[] calldata _externaladdress storage _stored, address memory _tempThe tool is structured with the following key components:
ConstructorAnalyzer: Core analysis engine with regex-based pattern matchingAnalysisResult: Structured data representing analysis findingsResultPrinter: Pretty-printed output with colors and formatting(address(?:\[\])?(?:\s+memory|\s+storage|\s+calldata)?)\s+(\w+)address _owner, address tokenContractaddress[] _tokens, address[] memory _listaddress storage _stored, address calldata _externalconstructor\s*\((.*?)\)\s*\{(.*?)\}function\s+initialize\s*\((.*?)\)\s*[^{]*\{(.*?)\}function\s+(\w+)\s*\((.*?)\)\s*[^{]*\{(.*?)\} (with --all-functions)(\w+)\s*(?:==|!=)\s*address\(0\)_owner == address(0), token != address(0)(?:require)\s*\(\s*([^,)]+)\s*(?:==|!=)\s*address\(0\)require(_owner != address(0), "message")This tool helps identify potential security vulnerabilities in smart contracts:
Zero Address Attacks: Prevent accidental or malicious zero address assignments
Constructor Security: Ensure critical addresses are validated during deployment
Upgradeable Contracts: Validate addresses in initialize functions for proxy contracts
Function Security: With --all-functions, catch missing validations in all address-handling functions
Array Validation: Detect missing validations for address arrays that could contain zero addresses
0: Analysis completed successfully1: Error occurred during analysis (file not found, invalid syntax, etc.)The --json flag outputs clean JSON without code blocks, perfect for:
git checkout -b feature/amazing-featuregit commit -m 'Add amazing feature'git push origin feature/amazing-featurecargo clippy passes without warningsThis project is licensed under the MIT License - see the LICENSE file for details.