Skip to content

Instantly share code, notes, and snippets.

@hugoabonizio
Last active November 10, 2017 12:06
Show Gist options
  • Save hugoabonizio/82bb6ca249f15de03a21ce8d9deeb924 to your computer and use it in GitHub Desktop.
Save hugoabonizio/82bb6ca249f15de03a21ce8d9deeb924 to your computer and use it in GitHub Desktop.
This program breaks Crystal compiler
a = {1, 0}
b = {a, a}
c = {b, b}
d = {c, c}
e = {d, d}
f = {e, e}
g = {f, f}
h = {g, g}
i = {h, h}
j = {i, i}
k = {j, j}
l = {k, k}
m = {l, l}
n = {m, m}
o = {n, n}
p = {o, o}
q = {p, p}
puts q
@hugoabonizio
Copy link
Author

$ crystal -v
Crystal 0.23.1 [e2a1389] (2017-07-13) LLVM 3.8.1

$ crystal program.cr 
crystal: /var/cache/omnibus/src/llvm/llvm-3.8.1.src/include/llvm/CodeGen/SelectionDAGNodes.h:800: llvm::SDNode::SDNode(unsigned int, unsigned int, llvm::DebugLoc, llvm::SDVTList, llvm::ArrayRef<llvm::SDValue>): Assertion `NumOperands == Ops.size() && "NumOperands wasn't wide enough for its operands!"' failed.
crystal: /var/cache/omnibus/src/llvm/llvm-3.8.1.src/include/llvm/CodeGen/SelectionDAGNodes.h:800: llvm::SDNode::SDNode(unsigned int, unsigned int, llvm::DebugLoc, llvm::SDVTList, llvm::ArrayRef<llvm::SDValue>): Assertion `NumOperands == Ops.size() && "NumOperands wasn't wide enough for its operands!"' failed.

crystal: /var/cache/omnibus/src/llvm/llvm-3.8.1.src/include/llvm/CodeGen/SelectionDAGNodes.h:800: llvm::SDNode::SDNode(unsigned int, unsigned int, llvm::DebugLoc, llvm::SDVTList, llvm::ArrayRef<llvm::SDValue>): Assertion `NumOperands == Ops.size() && "NumOperands wasn't wide enough for its operands!"' failed.
cc: error: S-lice40U-I-nt841.o: Arquivo ou diretório não encontrado
cc: error: P-ointer40U-I-nt841.o: Arquivo ou diretório não encontrado
cc: error: A-rgumentE-rror.o: Arquivo ou diretório não encontrado
cc: error: C-allS-tack.o: Arquivo ou diretório não encontrado
cc: error: A-rray40P-ointer40V-oid4141.o: Arquivo ou diretório não encontrado
cc: error: P-ointer40P-ointer40V-oid4141.o: Arquivo ou diretório não encontrado
cc: error: E-xception.o: Arquivo ou diretório não encontrado
cc: error: P-ointer40L-ibU-nwind5858E-xception41.o: Arquivo ou diretório não encontrado
cc: error: U-I-nt64.o: Arquivo ou diretório não encontrado
cc: error: U-I-nt8.o: Arquivo ou diretório não encontrado
cc: error: A-rray40S-tring41.o: Arquivo ou diretório não encontrado
cc: error: P-ointer40S-tring41.o: Arquivo ou diretório não encontrado
cc: error: S-taticA-rray40I-nt8443225641.o: Arquivo ou diretório não encontrado
cc: error: P-ointer40I-nt841.o: Arquivo ou diretório não encontrado
cc: error: I-nt32.o: Arquivo ou diretório não encontrado
cc: error: P-ointer40V-oid41.o: Arquivo ou diretório não encontrado
cc: error: F-iber.o: Arquivo ou diretório não encontrado
cc: error: T-hread.o: Arquivo ou diretório não encontrado
cc: error: S-et40T-hread41.o: Arquivo ou diretório não encontrado
cc: error: S-cheduler.o: Arquivo ou diretório não encontrado
cc: error: L-ibE-vent25858E-ventF-lags.o: Arquivo ou diretório não encontrado
cc: error: I-O-5858F-ileD-escriptor43.o: Arquivo ou diretório não encontrado
cc: error: E-vent5858E-vent.o: Arquivo ou diretório não encontrado
cc: error: I-nt64.o: Arquivo ou diretório não encontrado
cc: error: I-O-5858E-rror.o: Arquivo ou diretório não encontrado
cc: error: I-O-5858T-imeout.o: Arquivo ou diretório não encontrado
cc: error: E-xception43.o: Arquivo ou diretório não encontrado
cc: error: F-ile.o: Arquivo ou diretório não encontrado
cc: error: C-har5858R-eader.o: Arquivo ou diretório não encontrado
cc: error: R-ange40B-4432E-41.o: Arquivo ou diretório não encontrado
cc: error: R-ange40I-nt324432I-nt3241.o: Arquivo ou diretório não encontrado
cc: error: D-ebug5858E-L-F-.o: Arquivo ou diretório não encontrado
cc: error: D-ebug5858E-L-F-5858E-rror.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-36524b6557c989984dcb5da803fe29e5.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-97cb8e2515fc2ddcb5206e77d3e32de4.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-965cc8168ebca5ddf3a56b97e7128d55.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-c864f26add3d5535faf0d22dec329357.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-2d6f57ced9c790f6b4b843c63200ce5a.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-07970f8e6f9cd512a717d9dd996359f1.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-3afae762fe8ff73287afd6482bf4f6ec.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-614dd6d38a361d5e1e54348a1195e82e.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-b3371f030eafb451ef01acad99f8b503.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-6a909656d3e636ca602d14f12562d3af.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-e4e7ac7bbc2f3a2e2af150f197102d0d.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-aaa67a138ef88ae37c7eb923b048c0c5.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-545e8fc6274d2be970d0ae3928f5d9f9.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40T-2434b62c29908b3dda5b71463595dc72.o: Arquivo ou diretório não encontrado
cc: error: T-uple40T-uple40I-d803505db4dd26f3de10c1bdffb451e1.o: Arquivo ou diretório não encontrado
cc: error: T-uple40I-nt324432I-nt3241.o: Arquivo ou diretório não encontrado
Error: execution of command failed with code: 1: `cc "${@}" -o '/home/hugo/.cache/crystal/crystal-run-program.tmp'  -rdynamic  -lpcre -lgc -lpthread /opt/crystal/src/ext/libcrystal.a -levent -lrt -ldl -L/usr/lib -L/usr/local/lib`

@hugoabonizio
Copy link
Author

hugoabonizio commented Nov 9, 2017

@veelenga
Copy link

veelenga commented Nov 9, 2017

b written twice. Is this intentional ?

b = {a, a}
b = {a, a}

@JonnyCodewalker
Copy link

JonnyCodewalker commented Nov 9, 2017

@veelenga not needed, I can't test it right now, but the principle is that the faculty ^2 we are dealing with is breaking the stack I guess. There are 2 ^ 18 = 262144 Integers. Considering an Integer to be 32bit (not sure what the implementation is) we get 8388608bit, or rather 8192Mib or 1GiB. Depending on how the stack is implemented I can easily see that blowing it up.

Note that you can't really avoid that problem, since you could just add more and more "levels", but maybe you would search for a way to optimize it and maybe make the issue clearer?

@sam0x17
Copy link

sam0x17 commented Nov 10, 2017

This is a cool bug

@hugoabonizio
Copy link
Author

hugoabonizio commented Nov 10, 2017

@veelenga this wasn't intentional, I fixed it now! Thanks!

@JonnyCodewalker thank you for the explanation 😃

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment