-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 depth exhausted 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 depth exhausted at «string»:1:14: 1| (x: x x) (x: x x) | ^
- Loading branch information
Showing
5 changed files
with
101 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
tests/functional/lang/eval-fail-infinite-recursion-lambda.err.exp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
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 traces omitted) | ||
|
||
error: stack depth exhausted | ||
|
||
at /pwd/lang/eval-fail-infinite-recursion-lambda.nix:1:14: | ||
|
||
1| (x: x x) (x: x x) | ||
| ^ | ||
2| |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
(x: x x) (x: x x) |