Я написал пример кода 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;
}
}
Спасибо.
Будет ошибка времени выполнения, но не компилятор.
v
отливается как тип Sample
. Итак, у него есть методы Sample, и вы можете делать такие вещи, как:
v = new Sample();
или
v = Sample(_sampleAddress);
Ваш контракт не работает ни с тем, ни с другим function call()
во время выполнения.
Я не думаю, что solc
команда сочла бы это ошибкой. Группа статического анализа в команде Remix может счесть это полезным предложением, если его еще нет. Они вызывают всевозможные потенциальные опасения по поводу контрактов, которые компилируются, но, возможно, могут не выполнять то, что ожидает автор во время выполнения.
Надеюсь, это поможет.
v
ему никогда не присваивается значение, его использование в таких языках, как C, Java и т. д., является предупреждением. Я знаю, что Solidity инициализирует переменные нулем, но использование переменных без явной инициализации — не лучшая идея: Explicit лучше, чем implicit .solc
было бы отклонено как отчет об ошибке, но идея заслуживает внимания, так что это может быть частью крестового похода, чтобы отменить статус-кво, и любой хочет нести факел.
Исмаэль