What vulnerabilities are on the smart contract below:

pragma solidity ^0.6.6;

contract VulnerableContract {

    mapping (address => uint256) private balances;

    

    function deposit() public payable {

        balances[msg.sender] += msg.value;

    }

    

    function withdraw(uint256 _amount) public {

        require(balances[msg.sender] >= _amount);

        (bool success, ) = msg.sender.call{value: _amount}("");

        require(success);

        balances[msg.sender] -= _amount;

    }

    function balanceOf(address _addr) public view returns(uint256) {

        return balances[_addr];

    }

    function unsafeAdd(uint256 a, uint256 b) public pure returns (uint256) {

        uint256 c = a + b;

        return c;

    }

    function unsafeSubtract(uint256 a, uint256 b) public pure returns (uint256) {

        uint256 c = a - b;

        return c;

    }

}

