mirror of
https://github.com/NixOS/nix
synced 2025-06-27 12:41:15 +02:00
Fix segfault on infinite recursion in some cases
This fixes a segfault on infinite function call recursion (rather than infinite thunk recursion) by tracking the function call depth in `EvalState`. Additionally, to avoid printing extremely long stack traces, stack frames are now deduplicated, with a `(19997 duplicate traces omitted)` message. This should only really be triggered in infinite recursion scenarios. Before: $ nix-instantiate --eval --expr '(x: x x) (x: x x)' Segmentation fault: 11 After: $ nix-instantiate --eval --expr '(x: x x) (x: x x)' error: stack overflow at «string»:1:14: 1| (x: x x) (x: x x) | ^ $ nix-instantiate --eval --expr '(x: x x) (x: x x)' --show-trace error: … from call site at «string»:1:1: 1| (x: x x) (x: x x) | ^ … while calling anonymous lambda at «string»:1:2: 1| (x: x x) (x: x x) | ^ … from call site at «string»:1:5: 1| (x: x x) (x: x x) | ^ … while calling anonymous lambda at «string»:1:11: 1| (x: x x) (x: x x) | ^ … from call site at «string»:1:14: 1| (x: x x) (x: x x) | ^ (19997 duplicate traces omitted) error: stack overflow at «string»:1:14: 1| (x: x x) (x: x x) | ^
This commit is contained in:
parent
a21c762dab
commit
7434caca05
12 changed files with 358 additions and 4 deletions
|
@ -0,0 +1,38 @@
|
|||
error:
|
||||
… from call site
|
||||
at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:1:
|
||||
1| (x: x x) (x: x x)
|
||||
| ^
|
||||
2|
|
||||
|
||||
… while calling anonymous lambda
|
||||
at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:2:
|
||||
1| (x: x x) (x: x x)
|
||||
| ^
|
||||
2|
|
||||
|
||||
… from call site
|
||||
at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:5:
|
||||
1| (x: x x) (x: x x)
|
||||
| ^
|
||||
2|
|
||||
|
||||
… while calling anonymous lambda
|
||||
at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:11:
|
||||
1| (x: x x) (x: x x)
|
||||
| ^
|
||||
2|
|
||||
|
||||
… from call site
|
||||
at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:14:
|
||||
1| (x: x x) (x: x x)
|
||||
| ^
|
||||
2|
|
||||
|
||||
(19997 duplicate frames omitted)
|
||||
|
||||
error: stack overflow; max-call-depth exceeded
|
||||
at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:14:
|
||||
1| (x: x x) (x: x x)
|
||||
| ^
|
||||
2|
|
Loading…
Add table
Add a link
Reference in a new issue