cuelang / cue

CUE has moved to https://github.com/cue-lang/cue
https://cuelang.org
Apache License 2.0
3.09k stars 171 forks source link

internal/eval: invalid memory address or nil pointer dereference #843

Closed myitcv closed 3 years ago

myitcv commented 3 years ago

What version of CUE are you using (cue version)?

$ cue version
cue version +7c5d28e6 linux/amd64

Does this issue reproduce with the latest release?

Yes

What did you do?

# Diff
! exec diff -wu main1.cue main2.cue

# Succeeds
exec cue eval main1.cue
cmp stdout stdout.golden

# Fails
exec cue eval main2.cue
cmp stdout stdout.golden

-- main1.cue --
package main

#d1: {
    as: [...string]

    #c: [
        #f1 & {
            "as": ["go", for _, x in as {x}]
        },
    ]
}

#d2: {
    p: *"." | string

    #c: [
        #f2 & {
            from: #d1 & {
                as: [p]
            }
        },
    ]
}

#c1: {
    #c: [...#o]
    _
    ...
}

#o: #f1 | #f2

#f1: {
    do: "f1"
    as: [...string]
}

#f2: {
    do:   "f2"
    from: #c1
}
-- main2.cue --
package main

#d1: {
    as: [...string]

    #c: [
        #f1 & {
            "as": ["go"] + as
        },
    ]
}

#d2: {
    p: *"." | string

    #c: [
        #f2 & {
            from: #d1 & {
                as: [p]
            }
        },
    ]
}

#c1: {
    #c: [...#o]
    _
    ...
}

#o: #f1 | #f2

#f1: {
    do: "f1"
    as: [...string]
}

#f2: {
    do:   "f2"
    from: #c1
}
-- stdout.golden --
#d1: {
    as: []
    #c: [{
        do: "f1"
        as: ["go"]
    }]
}
#d2: {
    p: "."
    #c: [{
        do: "f2"
        from: {
            as: ["."]
            #c: [{
                do: "f1"
                as: ["go", "."]
            }]
        }
    }]
}
#c1: {
    _
    #c: []
}
#o: {
    do: "f1"
    as: []
} | {
    do: "f2"
    from: {
        _
        #c: []
    }
}
#f1: {
    do: "f1"
    as: []
}
#f2: {
    do: "f2"
    from: {
        _
        #c: []
    }
}

As you can see, there is a minimal diff between main1.cue and main2.cue:

--- main1.cue   2021-03-18 09:56:41.592765969 +0000
+++ main2.cue   2021-03-18 09:56:41.592765969 +0000
@@ -5,7 +5,7 @@

    #c: [
        #f1 & {
-           "as": ["go", for _, x in as {x}]
+           "as": ["go"] + as
        },
    ]
 }

But semantically both are identical.

However, whilst cue eval main1.cue succeeds, cue eval main2.cue does not:

panic: runtime error: invalid memory address or nil pointer dereference
    panic: freeNode: nodeContext out of sync
    panic: freeNode: nodeContext out of sync [recovered]
    panic: freeNode: nodeContext out of sync
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x648fa5]

goroutine 1 [running]:
cuelang.org/go/cmd/cue/cmd.recoverError(0xc000573ec0)
    /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:221 +0x9c
panic(0xb8d140, 0xd6aa40)
    /home/myitcv/gos/src/runtime/panic.go:972 +0x1d4
cuelang.org/go/internal/core/adt.(*Vertex).freeNode(0xc000562510, 0xc000561180)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:918 +0x132
panic(0xb8d140, 0xd6aa40)
    /home/myitcv/gos/src/runtime/panic.go:980 +0x4d7
cuelang.org/go/internal/core/adt.(*Vertex).freeNode(0xc000563320, 0xc000574380)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:918 +0x132
panic(0xbbf7a0, 0x117e7b0)
    /home/myitcv/gos/src/runtime/panic.go:980 +0x4d7
cuelang.org/go/cue/ast.(*ForClause).Pos(0x0, 0xc00058e5c0, 0x0)
    /home/myitcv/dev/cuelang/cue/cue/ast/ast.go:789 +0x5
cuelang.org/go/internal/core/adt.(*OpContext).pos(...)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/context.go:233
cuelang.org/go/internal/core/adt.(*OpContext).Newf(0xc0004f7110, 0xca4754, 0x29, 0xc0004320c0, 0x2, 0x2, 0x0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/errors.go:260 +0xab
cuelang.org/go/internal/core/adt.BinOp(0xc0004f7110, 0x9, 0xd8e578, 0xc000438ab0, 0xd8e1b8, 0xc00058e5c0, 0xc00056a7b8, 0xc0004f7110)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/binop.go:40 +0x3f9
cuelang.org/go/internal/core/adt.equalTerminal(0xc0004f7110, 0xd8e578, 0xc000438ab0, 0xd8e1b8, 0xc00058e5c0, 0xc000200003, 0xc00005e800)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/equality.go:143 +0x273
cuelang.org/go/internal/core/adt.equalVertex(0xc0004f7110, 0xc0005747e0, 0xd8e618, 0xc000438ab0, 0x3, 0xc000204498)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/equality.go:99 +0x231
cuelang.org/go/internal/core/adt.Equal(0xc0004f7110, 0xd8e618, 0xc0005747e0, 0xd8e618, 0xc000574b60, 0x3, 0x0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/equality.go:32 +0x68
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000574a80, 0xc00032db05, 0xc000574380, 0x2, 0xc000430101)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:376 +0x1052
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000574380, 0xc0004f7105, 0xc000574380, 0x0, 0x100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:232 +0x4a6
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000563320, 0xc0004ea202)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*ForClause).yield(0xc0004ea270, 0xc0004f7110, 0xc0004ea390)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/expr.go:1588 +0xd7
cuelang.org/go/internal/core/adt.(*OpContext).Yield(0xc0004f7110, 0xc00032d4f0, 0xd84c28, 0xc0004ea270, 0xc0004ea390, 0x0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/context.go:446 +0xea
cuelang.org/go/internal/core/adt.(*nodeContext).addLists(0xc000574000, 0x0, 0x2, 0x0, 0x0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:2028 +0x18b3
cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000574000, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:457 +0xf6
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000574000, 0xc0004f7105, 0xc000574000, 0x0, 0x100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000563560, 0xc000563505)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*Vertex).Finalize(0xc000563560, 0xc0004f7110)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/composite.go:441 +0x3a
cuelang.org/go/internal/core/adt.BinOp(0xc0004f7110, 0x12, 0xd8e618, 0xc000563200, 0xd8e618, 0xc000562480, 0x0, 0xc000562480)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/binop.go:204 +0xae5
cuelang.org/go/internal/core/adt.(*BinaryExpr).evaluate(0xc000438750, 0xc0004f7110, 0xc000438750, 0x7f968c452bc0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/expr.go:1150 +0x3dc
cuelang.org/go/internal/core/adt.(*OpContext).evalState(0xc0004f7110, 0xd89938, 0xc000438750, 0x40c802, 0x0, 0x0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/context.go:619 +0x3a2
cuelang.org/go/internal/core/adt.(*OpContext).evaluateRec(0xc0004f7110, 0xc00032d4f0, 0xd89938, 0xc000438750, 0xc000411202, 0x0, 0x0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/context.go:547 +0x11a
cuelang.org/go/internal/core/adt.(*nodeContext).evalExpr(0xc000561c00, 0xc00032d4f0, 0xd7ec30, 0xc0004112a0, 0xc000411d60, 0x0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:1231 +0x246
cuelang.org/go/internal/core/adt.(*nodeContext).addExprConjunct(0xc000561c00, 0xc00032d4f0, 0xd7ec30, 0xc0004112a0, 0xc000411d60, 0x0)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:1172 +0x49d
cuelang.org/go/internal/core/adt.(*nodeContext).insertConjuncts(0xc000561c00)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:391 +0xfb
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000563050, 0xc00056d805)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:255 +0x27f
cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc000561500, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d
cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000561500, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000561500, 0xc00032d805, 0xc000561180, 0x0, 0xc000410101)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000561180, 0xc0004f7105, 0xc000561180, 0x0, 0xc0003b0100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:232 +0x4a6
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000562510, 0xc0003b6d05)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc000560e00, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d
cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000560e00, 0xc000560705)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000560e00, 0xc000000205, 0xc000560e00, 0x0, 0xd80100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc0005623f0, 0xc0003b7a05)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc000560700, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d
cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000560700, 0xc00032d205)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000560700, 0xc000000205, 0xc000560700, 0x0, 0xc000430100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc0005622d0, 0xc0003b8705)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc000560380, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d
cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc000560380, 0xc000439605)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc000560380, 0xc0004f7105, 0xc000560380, 0x0, 0xc0003b0100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000562090, 0xc0003b9305)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc0004f4700, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d
cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc0004f4700, 0xc0004f4705)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc0004f4700, 0xc000000205, 0xc0004f4700, 0x0, 0x100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000559e60, 0xc0003ba005)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc0004f4380, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d
cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc0004f4380, 0xc0004f4305)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc0004f4380, 0xc000000205, 0xc0004f4380, 0x0, 0xd80100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000558f30, 0xc0003bad05)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*nodeContext).completeArcs(0xc0004f4000, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:656 +0x13d
cuelang.org/go/internal/core/adt.(*nodeContext).postDisjunct(0xc0004f4000, 0x203005)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:589 +0x53b
cuelang.org/go/internal/core/adt.(*nodeContext).expandDisjuncts(0xc0004f4000, 0xc0004f7105, 0xc0004f4000, 0x0, 0x100)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/disjunct.go:151 +0x15e8
cuelang.org/go/internal/core/adt.(*OpContext).Unify(0xc0004f7110, 0xc000558870, 0x5)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/eval.go:309 +0x479
cuelang.org/go/internal/core/adt.(*Vertex).Finalize(...)
    /home/myitcv/dev/cuelang/cue/internal/core/adt/composite.go:441
cuelang.org/go/cue.(*Instance).Value(0xc000352690, 0x6, 0xc00038a140)
    /home/myitcv/dev/cuelang/cue/cue/instance.go:266 +0x65
cuelang.org/go/cmd/cue/cmd.buildInstances(0xc00038a140, 0xc000431e28, 0x1, 0x1, 0xc00028bcc0, 0xc00028bcb0, 0xd79a80)
    /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/common.go:553 +0x131
cuelang.org/go/cmd/cue/cmd.(*buildPlan).instances(0xc000310180, 0x0, 0x0)
    /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/common.go:155 +0x58
cuelang.org/go/cmd/cue/cmd.runEval(0xc00038a140, 0xc0003375a0, 0x1, 0x1, 0x0, 0x0)
    /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/eval.go:113 +0x399
cuelang.org/go/cmd/cue/cmd.mkRunE.func1(0xc0000c9b80, 0xc0003375a0, 0x1, 0x1, 0x0, 0x0)
    /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:46 +0x6c
github.com/spf13/cobra.(*Command).execute(0xc0000c9b80, 0xc000337570, 0x1, 0x1, 0xc0000c9b80, 0xc000337570)
    /home/myitcv/gostuff/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:842 +0x472
github.com/spf13/cobra.(*Command).ExecuteC(0xc0000c9340, 0x0, 0x0, 0x0)
    /home/myitcv/gostuff/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:950 +0x37e
github.com/spf13/cobra.(*Command).Execute(...)
    /home/myitcv/gostuff/pkg/mod/github.com/spf13/cobra@v1.0.0/command.go:887
cuelang.org/go/cmd/cue/cmd.(*Command).Run(0xc00038a140, 0xd87a50, 0xc000124030, 0x0, 0x0)
    /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:206 +0x67
cuelang.org/go/cmd/cue/cmd.mainErr(0xd87a50, 0xc000124030, 0xc00011c070, 0x2, 0x2, 0xc00005a740, 0x469cc5)
    /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:145 +0x8d
cuelang.org/go/cmd/cue/cmd.Main(0xc00010e058)
    /home/myitcv/dev/cuelang/cue/cmd/cue/cmd/root.go:127 +0x9b
main.main()
    /home/myitcv/dev/cuelang/cue/cmd/cue/main.go:24 +0x25

What did you expect to see?

No panic and the test to pass.

What did you see instead?

The panic above.

cc @verdverm

cueckoo commented 3 years ago

This issue has been migrated to https://github.com/cue-lang/cue/issues/843.

For more details about CUE's migration to a new home, please see https://github.com/cue-lang/cue/issues/1078.