Nim
Nim copied to clipboard
cross-package endless recursion
What happened?
hey,
I have a super weird bug, I wrote two functions: encrypt_cbc
and decrypt_cbc
(both uses the nimcrypto
package) - they both get the following parameters (string, key, iv)
and do their job great.
Whenever I'm importing winim/clr
to the program (Winim) - context.init(key, iv)
calls for some reason to Winim CLR which invokes an endless recursion there, which crashes the program..
The functions:
proc encrypt_cbc(plain_text: string, key: string, iv: string): string =
var ectx: CBC[aes256]
var cipher_text = newString(aes256.sizeBlock * 2)
var plain_text_padded = plain_text
while len(plain_text_padded) mod 32 != 0:
plain_text_padded = plain_text_padded & " "
ectx.init(key, iv) # <- Problem starts from here
ectx.encrypt(plain_text_padded, cipher_text)
ectx.clear()
return cipher_text
proc decrypt_cbc(cipher_text: string, key: string, iv: string): string =
var dctx: CBC[aes256]
var plain_text = newString(aes256.sizeBlock * 2)
dctx.init(key, iv) # <- Problem starts from here
dctx.decrypt(cipher_text, plain_text)
dctx.clear()
while plain_text.endsWith(" "):
plain_text.removeSuffix(" ")
return plain_text
thanks in advance, Itay
Nim Version
Nim Compiler Version 1.4.8 [Windows: amd64]
Current Standard Output Logs
Hint: c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.exe [Exec]
Traceback (most recent call last)
c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.nim(74) agent_test
c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.nim(70) main
c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.nim(38) decrypt_cbc
C:\Users\Owner\.nimble\pkgs\nimcrypto-0.5.4\nimcrypto\bcmode.nim(275) init
C:\Users\Owner\.nimble\pkgs\nimcrypto-0.5.4\nimcrypto\bcmode.nim(261) init
C:\Users\Owner\.nimble\pkgs\nimcrypto-0.5.4\nimcrypto\rijndael.nim(1092) init
C:\Users\Owner\.nimble\pkgs\nimcrypto-0.5.4\nimcrypto\utils.nim(343) keySchedule
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
(1874 calls omitted) ...
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(747) toObject
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(101) toCLRVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\com.nim(437) toVariant
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim(761) []
C:\Users\Owner\.nimble\pkgs\winim-3.6.1\winim\clr.nim toObject
Error: call depth limit reached in a debug build (2000 function calls). You can change it with -d:nimCallDepthLimit=<int> but really try to avoid deep recursions instead.
Error: execution of an external program failed: 'c:\Users\Owner\Desktop\ScriptsAndTools\MyProjects\<REDACTED>\agent\agent_test.exe '
Possible Solution
maybe if I could tell nimcrypto
explicitly somewhere not to use winim/clr
Is there a specific reason you assume this to be an issue with the nim language rather than nimcrypto?
Actually I'm not sure where is the bug as I'm still new to Nim. If you think it is not related I'll close this one..
Actually I'm not sure where is the bug as I'm still new to Nim. If you think it is not related I'll close this one..
I do not have that authority as I'm just another user that stumbled over your bug, however your output logs indicate to me that some code in nimcrypto is raising the error. The question is whether nimcrypto contains incorrect code, or whether it's code is completely correct but the compiler has a bug at that point somehwere. Which of these it is should first be evaluated by the maintainers of nimcrypto I would think.
If my own package tinypool
were the cause of somebody to have an error I would also expect them to file an issue with my package, not with the nim language at large.
Yes, I understand. Anyway I managed to solve it by splitting it to different files/modules and export only specific functions - ugly workaround
Nice to hear you figured out a way around it for now!