mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-23 03:38:35 +00:00
compiler: check that safe methods exist
If a method is missing from the manifest, it is most likely a typo or regression after refactoring. There is no "turn-off" flag for this error because we can do this precisely. Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
b4e24bef14
commit
0c01d89827
2 changed files with 19 additions and 0 deletions
|
@ -270,6 +270,11 @@ func CreateManifest(di *DebugInfo, o *Options) (*manifest.Manifest, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return m, fmt.Errorf("failed to convert debug info to manifest: %w", err)
|
return m, fmt.Errorf("failed to convert debug info to manifest: %w", err)
|
||||||
}
|
}
|
||||||
|
for _, name := range o.SafeMethods {
|
||||||
|
if m.ABI.GetMethod(name, -1) == nil {
|
||||||
|
return m, fmt.Errorf("method %s is marked as safe but missing from manifest", name)
|
||||||
|
}
|
||||||
|
}
|
||||||
if !o.NoStandardCheck {
|
if !o.NoStandardCheck {
|
||||||
if err := standard.CheckABI(m, o.ContractSupportedStandards...); err != nil {
|
if err := standard.CheckABI(m, o.ContractSupportedStandards...); err != nil {
|
||||||
return m, err
|
return m, err
|
||||||
|
|
|
@ -125,6 +125,20 @@ func TestOnPayableChecks(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSafeMethodWarnings(t *testing.T) {
|
||||||
|
src := `package payable
|
||||||
|
func Main() int { return 1 }`
|
||||||
|
|
||||||
|
_, di, err := compiler.CompileWithDebugInfo("eventTest", strings.NewReader(src))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, err = compiler.CreateManifest(di, &compiler.Options{SafeMethods: []string{"main"}})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
_, err = compiler.CreateManifest(di, &compiler.Options{SafeMethods: []string{"main", "mississippi"}})
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestEventWarnings(t *testing.T) {
|
func TestEventWarnings(t *testing.T) {
|
||||||
src := `package payable
|
src := `package payable
|
||||||
import "github.com/nspcc-dev/neo-go/pkg/interop/runtime"
|
import "github.com/nspcc-dev/neo-go/pkg/interop/runtime"
|
||||||
|
|
Loading…
Reference in a new issue