Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Infinite loop after stack overflow fix #33

Open
krzysztof-miemiec opened this issue Mar 13, 2019 · 4 comments
Open

Infinite loop after stack overflow fix #33

krzysztof-miemiec opened this issue Mar 13, 2019 · 4 comments

Comments

@krzysztof-miemiec
Copy link

After merging #31 (which seemed to be a perfect fix for me) the linting never finishes for some of my projects. I guess that we should add some kind of limiter there.

@Hexide
Copy link

Hexide commented Mar 13, 2019

Hello. I can report similar issue after updating from 0.6.1 to 0.6.2.

tslint --config tslint.json --project tsconfig.json --format json --out ....
no-unused-variable is deprecated. Since TypeScript 2.9. Please use the built-in compiler checks instead.
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->

[33:0x306d6c0]   268640 ms: Scavenge 1370.7 (1422.6) -> 1369.7 (1423.1) MB, 7.0 / 0.0 ms  (average mu = 0.374, current mu = 0.379) allocation failure 
[33:0x306d6c0]   268648 ms: Scavenge 1370.7 (1423.1) -> 1369.7 (1423.6) MB, 5.4 / 0.0 ms  (average mu = 0.374, current mu = 0.379) allocation failure 
[33:0x306d6c0]   268656 ms: Scavenge 1370.7 (1423.6) -> 1369.8 (1424.6) MB, 5.7 / 0.0 ms  (average mu = 0.374, current mu = 0.379) allocation failure 


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x1e8810b841bd]
Security context: 0x31158061e6c9 <JSObject>
    1: next [0x31158061a129](this=0x671ddf864c1 <MapIterator map = 0x26ff5c06249>)
    2: from [0x311580606509](this=0x311580606361 <JSFunction Array (sfi = 0xe4ffd612209)>,0x671ddf864c1 <MapIterator map = 0x26ff5c06249>)
    3: getAllCycles(aka getAllCycles) [0x3de9c9433161] [/builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImp...

 1: 0x89c2f0 node::Abort() [node]
 2: 0x89c33c  [node]
 3: 0xa8f05e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
 4: 0xa8f278 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
 5: 0xe7cad2  [node]
 6: 0xe88a2a v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
 7: 0xe89394 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
 8: 0xe8bcc5 v8::internal::Heap::AllocateRawWithRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [node]
 9: 0xe541a4 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [node]
10: 0x10f563e v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [node]
11: 0x1e8810b841bd 
Aborted (core dumped)

After including --node-arg=--max_old_space_size=6144, seemed to help with out of memory, but process does not complete. Following backtrace captured while process was running:

debug> pause
break in builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:188
 186                 var c = getAllCycles(imp, accumulator.concat(moduleName), iterationDepth + 1);
 187                 try {
>188                     for (var c_1 = __values(c), c_1_1 = c_1.next(); !c_1_1.done; c_1_1 = c_1.next()) {
 189                         var cycle = c_1_1.value;
 190                         all.push(cycle);
debug> bt
#0 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:188:20
#1 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#2 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#3 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#4 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#5 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#6 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#7 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#8 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#9 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#10 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#11 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#12 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#13 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#14 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#15 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#16 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#17 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#18 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#19 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#20 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#21 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#22 getAllCycles builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:186:24
#23 walk builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:120:24
#24 AbstractRule.applyWithFunction builds/xxxxxxx/node_modules/tslint/lib/language/rule/abstractRule.js:39:8
#25 Rule.applyWithProgram builds/xxxxxxx/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:66:20
#26 Linter.applyRule builds/xxxxxxx/node_modules/tslint/lib/linter.js:211:28
#27 (anonymous) builds/xxxxxxx/node_modules/tslint/lib/linter.js:155:84
#28 flatMap builds/xxxxxxx/node_modules/tslint/lib/utils.js:160:28
#29 Linter.getAllFailures builds/xxxxxxx/node_modules/tslint/lib/linter.js:155:31
#30 Linter.lint builds/xxxxxxx/node_modules/tslint/lib/linter.js:110:32
#31 (anonymous) builds/xxxxxxx/node_modules/tslint/lib/runner.js:214:31
#32 step builds/xxxxxxx/node_modules/tslib/tslib.js:133:26
#33 (anonymous) builds/xxxxxxx/node_modules/tslib/tslib.js:114:56
#34 (anonymous) builds/xxxxxxx/node_modules/tslib/tslib.js:107:74
#35 __awaiter builds/xxxxxxx/node_modules/tslib/tslib.js:103:15
#36 doLinting builds/xxxxxxx/node_modules/tslint/lib/runner.js:166:19
#37 (anonymous) builds/xxxxxxx/node_modules/tslint/lib/runner.js:106:34
#38 step builds/xxxxxxx/node_modules/tslib/tslib.js:133:26
#39 (anonymous) builds/xxxxxxx/node_modules/tslib/tslib.js:114:56
#40 (anonymous) builds/xxxxxxx/node_modules/tslib/tslib.js:107:74
#41 __awaiter builds/xxxxxxx/node_modules/tslib/tslib.js:103:15
#42 runLinter builds/xxxxxxx/node_modules/tslint/lib/runner.js:87:19
#43 (anonymous) builds/xxxxxxx/node_modules/tslint/lib/runner.js:75:41
#44 step builds/xxxxxxx/node_modules/tslib/tslib.js:133:26
#45 (anonymous) builds/xxxxxxx/node_modules/tslib/tslib.js:114:56
#46 (anonymous) builds/xxxxxxx/node_modules/tslib/tslib.js:107:74
#47 __awaiter builds/xxxxxxx/node_modules/tslib/tslib.js:103:15
#48 runWorker builds/xxxxxxx/node_modules/tslint/lib/runner.js:53:19
#49 (anonymous) builds/xxxxxxx/node_modules/tslint/lib/runner.js:37:41
#50 step builds/xxxxxxx/node_modules/tslib/tslib.js:133:26
#51 (anonymous) builds/xxxxxxx/node_modules/tslib/tslib.js:114:56
#52 (anonymous) builds/xxxxxxx/node_modules/tslib/tslib.js:107:74
#53 __awaiter builds/xxxxxxx/node_modules/tslib/tslib.js:103:15
#54 run builds/xxxxxxx/node_modules/tslint/lib/runner.js:31:19
#55 (anonymous) builds/xxxxxxx/node_modules/tslint/lib/tslintCli.js:187:9
#56 Module._compile internal/modules/cjs/loader.js:689:29
#57 Module._extensions..js internal/modules/cjs/loader.js:700:9
#58 Module.load internal/modules/cjs/loader.js:599:31
#59 tryModuleLoad internal/modules/cjs/loader.js:538:11
#60 Module._load internal/modules/cjs/loader.js:530:2
#61 Module.require internal/modules/cjs/loader.js:637:16
#62 require internal/modules/cjs/helpers.js:20:17
#63 (anonymous) builds/xxxxxxx/node_modules/tslint/bin/tslint:3:0
#64 Module._compile internal/modules/cjs/loader.js:689:29
#65 Module._extensions..js internal/modules/cjs/loader.js:700:9
#66 Module.load internal/modules/cjs/loader.js:599:31
#67 tryModuleLoad internal/modules/cjs/loader.js:538:11
#68 Module._load internal/modules/cjs/loader.js:530:2
#69 Module.runMain internal/modules/cjs/loader.js:742:11
#70 startup internal/bootstrap/node.js:236:18
#71 bootstrapNodeJSCore internal/bootstrap/node.js:560:2

@elias551
Copy link

elias551 commented Mar 28, 2019

Hi, sorry I cannot help a lot but I'm experiencing the same problem with 0.6.2 on linux

$ tslint --project ./tsconfig.json './src/**/*.{ts,tsx}'

<--- Last few GCs --->

[12036:0x3728a10]   181168 ms: Scavenge 1378.1 (1422.7) -> 1377.2 (1423.2) MB, 6.3 / 0.0 ms  (average mu = 0.344, current mu = 0.325) allocation failure 
[12036:0x3728a10]   181176 ms: Scavenge 1378.2 (1423.2) -> 1377.3 (1423.7) MB, 4.8 / 0.0 ms  (average mu = 0.344, current mu = 0.325) allocation failure 
[12036:0x3728a10]   181184 ms: Scavenge 1378.2 (1423.7) -> 1377.3 (1424.2) MB, 4.1 / 0.0 ms  (average mu = 0.344, current mu = 0.325) allocation failure 


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x3f32da45be1d]
Security context: 0x230b46d9e6e9 <JSObject>
    1: next [0x230b46d9a179](this=0x36688de0bb81 <MapIterator map = 0x19ddcec862a1>)
    2: from [0x230b46d868e1](this=0x230b46d86739 <JSFunction Array (sfi = 0x20734820ff59)>,0x36688de0bb81 <MapIterator map = 0x19ddcec862a1>)
    3: getAllCycles(aka getAllCycles) [0x33bbcb96741] [/source-code/node_modules/tslint-no-circular-imports/noCir...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x8dc510 node::Abort() [/usr/bin/node]
 2: 0x8dc55c  [/usr/bin/node]
 3: 0xad9b5e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [/usr/bin/node]
 4: 0xad9d94 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/usr/bin/node]
 5: 0xec7bf2  [/usr/bin/node]
 6: 0xec7cf8 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/usr/bin/node]
 7: 0xed3dd2 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/usr/bin/node]
 8: 0xed4704 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/usr/bin/node]
 9: 0xed7371 v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/usr/bin/node]
10: 0xea07f4 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/usr/bin/node]
11: 0x114018e v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
12: 0x3f32da45be1d 
Aborted (core dumped)

I tried with 0.6.1 and I get the following log for some modules :

The 'no-circular-imports' rule threw an error in '/source-code/src/components/content-page/global/index.ts':
RangeError: Maximum call stack size exceeded
    at getAllCycles (/source-code/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:185:30)
    at getAllCycles (/source-code/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:183:25)
    at getAllCycles (/source-code/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:183:25)
    at walk (/source-code/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:120:25)
    at Rule.AbstractRule.applyWithFunction (/source-code/node_modules/tslint/lib/language/rule/abstractRule.js:39:9)
    at Rule.applyWithProgram (/source-code/node_modules/tslint-no-circular-imports/noCircularImportsRule.js:66:21)
    at Linter.applyRule (/source-code/node_modules/tslint/lib/linter.js:206:29)
    at /source-code/node_modules/tslint/lib/linter.js:150:85
    at Object.flatMap (/source-code/node_modules/tslint/lib/utils.js:160:29)
    at Linter.getAllFailures (/source-code/node_modules/tslint/lib/linter.js:150:32)

The number of calls to getAllCycles in the stack trace may be different for each file

I can get the execution result after that, and the files that ran through an error do not appear in the result.

After looking at the getAllCycles method, maybe it could be rewritten without the recursion ?

function getAllCycles(
  moduleName: string,
  searchDepthLimit: number,
): string[][] {
  const modulesToScan = [moduleName];

  const all: string[][] = [];
  while (modulesToScan.length) {
    const moduleImport = imports.get(modulesToScan.shift()!);
    let accumulator = [],
    let iterationDepth = 0;
    // TODO
  }
  return all;
}

@elias551
Copy link

I tried to use search-depth-limit and i can run it without errors when I reduce the default value (current: 50)

"no-circular-imports": [true, { "search-depth-limit": 5 }],

@krzysztof-miemiec
Copy link
Author

I think that this PR may also help with the issue we currently have: #32

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants