Почему solc не обнаруживает проблему в этом коде?

Я написал пример кода Solidity ниже: в функции call()контракта sample_callя вызываю функцию add_car()функции другого контракта sample, но это ошибка, так как переменная vникогда не инициализируется.

Я предположил, что solc должен обнаружить эту проблему и пожаловаться, но, напротив, он успешно скомпилировал код.

Считаете ли вы, что именно здесь следует улучшить solc?

pragma solidity ^0.4.1;

contract sample_call {
    function call() public pure {
        uint a;
        sample v;   // v is never initialized

        a = v.add_var(0x22); // BUG HERE, because v is uninitialized
    }
}

contract sample {
    function add_var(uint a) public pure returns(uint) {
    return a + 0x55;
    }
}

Спасибо.

Пожалуйста, сообщайте о таких проблемах в их github.

Ответы (1)

Будет ошибка времени выполнения, но не компилятор.

vотливается как тип Sample. Итак, у него есть методы Sample, и вы можете делать такие вещи, как:

v = new Sample();

или

v = Sample(_sampleAddress);

Ваш контракт не работает ни с тем, ни с другим function call()во время выполнения.

Я не думаю, что solcкоманда сочла бы это ошибкой. Группа статического анализа в команде Remix может счесть это полезным предложением, если его еще нет. Они вызывают всевозможные потенциальные опасения по поводу контрактов, которые компилируются, но, возможно, могут не выполнять то, что ожидает автор во время выполнения.

Надеюсь, это поможет.

Доступ к неинициализированным переменным можно определить во время компиляции. И это хорошая функция.
Было бы здорово, если бы компилятор предположил, что в игре есть контракт, который нигде не создается. Это «как задумано», по крайней мере, на данный момент, так что, возможно, это скорее просьба или жалоба, чем «ошибка».
Это всего лишь мнение, но vему никогда не присваивается значение, его использование в таких языках, как C, Java и т. д., является предупреждением. Я знаю, что Solidity инициализирует переменные нулем, но использование переменных без явной инициализации — не лучшая идея: Explicit лучше, чем implicit .
Я согласен Это то, что есть, но, может быть, это не должно быть именно так. Так что, да, я думаю, что это solcбыло бы отклонено как отчет об ошибке, но идея заслуживает внимания, так что это может быть частью крестового похода, чтобы отменить статус-кво, и любой хочет нести факел.