Ich habe unten einen Solidity-Beispielcode geschrieben: In function call()
of contract sample_call
rufe ich die Funktion add_car()
function eines anderen Vertrages sample
auf, aber das ist ein Fehler, da die Variable v
nie initialisiert wird.
Ich ging davon aus, dass solc dieses Problem erkennen und sich beschweren sollte, aber im Gegensatz dazu hat es den Code glücklich kompiliert.
Denken Sie, dass Solc hier verbessert werden sollte?
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;
}
}
Vielen Dank.
Es wird einen Laufzeitfehler geben, aber keinen Compiler.
v
wird als Typ gecastet Sample
. Es hat also die Methoden von Sample und Sie können Dinge tun wie:
v = new Sample();
oder
v = Sample(_sampleAddress);
Ihr Vertrag tut dies auch nicht, also function call()
schlägt er zur Laufzeit fehl.
Ich glaube nicht, dass das solc
Team das für einen Bug halten würde. Die statische Analysegruppe im Remix-Team könnte es als nützlichen Vorschlag betrachten, wenn es nicht bereits vorhanden ist. Sie werfen alle möglichen Bedenken hinsichtlich Verträgen auf, die kompiliert werden, aber möglicherweise zur Laufzeit nicht das tun, was der Autor erwartet.
Ich hoffe es hilft.
v
es wird nie ein Wert zugewiesen, die Verwendung in Sprachen wie C, Java usw. ist eine Warnung. Ich weiß, dass solidity Variablen auf Null initialisiert, aber die Verwendung von Variablen ohne explizite Initialisierung ist keine gute Idee: Explizit ist besser als implizit .solc
, sie würden es als Fehlerbericht ablehnen, aber die Idee hat ihre Berechtigung, also könnte dies Teil eines Kreuzzugs sein, um den Status quo zu stürzen, und jeder möchte die Fackel tragen.
Ismael