https://github.com/selfint/ltsa
Static analysis tools leveraging LSP and tree-sitter.
https://github.com/selfint/ltsa
Last synced: 8 months ago
JSON representation
Static analysis tools leveraging LSP and tree-sitter.
- Host: GitHub
- URL: https://github.com/selfint/ltsa
- Owner: selfint
- Created: 2023-03-24T16:27:52.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2023-07-09T14:34:45.000Z (almost 3 years ago)
- Last Synced: 2025-02-14T08:49:14.087Z (over 1 year ago)
- Language: Solidity
- Size: 271 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ltsa
Static analysis tools leveraging LSP and tree-sitter.
## Example output
Executed on [contract](https://github.com/selfint/ltsa/tree/main/tools/scanexr/tests/solidity/contract)
Stacktrace: 1
function other(address a, uint b) pure returns (uint, address) {
return (b, a);
}
function hacky(address target, uint amount) {
(bool sent, ) = target.call{value: amount}("");
/* ^^^^^^ start */
require(sent, "Failed to send Ether");
}
function other(address a, uint b) pure returns (uint, address) {
return (b, a);
}
function hacky(address target, uint amount) {
(bool sent, ) = target.call{value: amount}("");
/* ^^^^^^ start */
require(sent, "Failed to send Ether");
}
function other(address a, uint b) pure returns (uint, address) {
return (b, a);
}
function hacky(address target, uint amount) {
(bool sent, ) = target.call{value: amount}("");
/* ^^^^^^ start */
require(sent, "Failed to send Ether");
}
function other(address a, uint b) pure returns (uint, address) {
return (b, a);
}
function hacky(address target, uint amount) {
(bool sent, ) = target.call{value: amount}("");
/* ^^^^^^ start */
require(sent, "Failed to send Ether");
}
function other(address a, uint b) pure returns (uint, address) {
return (b, a);
}
function hacky(address target, uint amount) {
(bool sent, ) = target.call{value: amount}("");
/* ^^^^^^ start */
require(sent, "Failed to send Ether");
}
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
balances[bar] = 0;
}
// Helper function to check the balance of this contract
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
balances[bar] = 0;
}
// Helper function to check the balance of this contract
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
balances[bar] = 0;
}
// Helper function to check the balance of this contract
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
(uint c, address d) = other(a2, 1);
return d;
}
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
return d;
}
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
return d;
}
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
(uint c, address d) = other(a2, 1);
return d;
}
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
hacky(bar, bal);
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
address bar = foo(sender, sender);
uint bal = balances[bar];
require(bal > 0);
function getSender2() private view returns (address) {
return msg.sender;
/* ^^^^^^^^^^ definition */
}
function getSender() private view returns (address) {
if (false) {
return foo(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
} else if (false) {
return ret2(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
}
function getSender() private view returns (address) {
if (false) {
return foo(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
} else if (false) {
return ret2(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
}
/* ^^^^^^^^^^ definition */
}
function getSender() private view returns (address) {
if (false) {
return foo(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
} else if (false) {
return ret2(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
}
(uint c, address d) = other(a2, 1);
return d;
}
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
return d;
}
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
return d;
}
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
(uint c, address d) = other(a2, 1);
return d;
}
function foo(address a, address b) private pure returns (address) {
return a;
}
function withdraw() public {
address sender = getSender();
/* ^^^^^^^^^^ definition */
}
function getSender() private view returns (address) {
if (false) {
return foo(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
} else if (false) {
return ret2(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
}
/* ^^^^^^^^^^ definition */
}
function getSender() private view returns (address) {
if (false) {
return foo(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
} else if (false) {
return ret2(0x0000000000000000000000000000000000000000, msg.sender);
/* ^^^^^^^^^^ definition */
}