// pragma solidity ^0.4.24;

contract Uninitialized{

    address destination;

    function transfer() payable public{
        destination.transfer(msg.value);
    }

}


contract Test {
    mapping (address => uint) balances;
    mapping (address => uint) balancesInitialized;


    function init() {
        balancesInitialized[msg.sender] = 0;
    }

    function use() {
        // random operation to use the mapping
        require(balances[msg.sender] == balancesInitialized[msg.sender]);
    }
}

library Lib{

    struct MyStruct{
        uint val;
    }

    function set(MyStruct storage st, uint v){
        st.val = 4;
    }

}


contract Test2 {
    using Lib for Lib.MyStruct;

    Lib.MyStruct st;
    Lib.MyStruct stinitialized;
    uint v; // v is used as parameter of the lib, but is never init

    function init(){
        stinitialized.set(v);
    }

    function use(){
        // random operation to use the structure
        require(st.val  == stinitialized.val);
    }

}

contract Test3 {
    string s;

    function a() public {
        string storage ss = s;
    }
}