Warum erkennt Solc kein Problem in diesem Code?

Ich habe unten einen Solidity-Beispielcode geschrieben: In function call()of contract sample_callrufe ich die Funktion add_car()function eines anderen Vertrages sampleauf, aber das ist ein Fehler, da die Variable vnie 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.

Bitte melden Sie solche Probleme an deren Github.

Antworten (1)

Es wird einen Laufzeitfehler geben, aber keinen Compiler.

vwird 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 solcTeam 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.

Der Zugriff auf nicht initialisierte Variablen kann zur Kompilierzeit bestimmt werden. Und es ist ein nettes Feature.
Es wäre großartig, wenn der Compiler vorschlagen würde, dass ein Vertrag im Spiel zu sein scheint, der nirgendwo von irgendetwas instanziiert wird. Es ist zumindest vorerst "wie vorgesehen", also ist es vielleicht eher eine Feature-Anfrage oder ein Kritikpunkt als ein "Fehler".
Es ist nur eine Meinung, aber ves 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 .
Ich stimme zu, es ist, wie es ist, aber vielleicht sollte es genau so nicht sein. Also, ja, ich denke 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.