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

Process hangs forever #11

Closed
danslo opened this issue Jul 31, 2017 · 5 comments
Closed

Process hangs forever #11

danslo opened this issue Jul 31, 2017 · 5 comments
Assignees

Comments

@danslo
Copy link

danslo commented Jul 31, 2017

With many contracts, we'll be stuck in a loop forever. Contract code example:

6060604052341561000c57fe5b5b73209c4784ab1e8183cf58ca33cb740efbf3fc18ef600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b42b20ddbeabdc2a288be7ff847ff94fb48d2579600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6104a0806100c86000396000f30060606040523615610055576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063661172761461014857806382c90ac01461017e578063b76ea962146101b4575b6101465b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405180905060006040518083038185876187965a03f1925050501561013d577f23919512b2162ddc59b67a65e3b03c419d4105366f7d4a632f5d3c3bee9b1cff600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1610143565b60006000fd5b5b565b005b341561015057fe5b61017c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610225565b005b341561018657fe5b6101b2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102c8565b005b610223600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061036b565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102825760006000fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103255760006000fd5b80600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103c85760006000fd5b8173ffffffffffffffffffffffffffffffffffffffff1634826040518082805190602001908083836000831461041d575b80518252602083111561041d576020820191506020810190506020830392506103f9565b505050905090810190601f1680156104495780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876187965a03f192505050151561046e5760006000fd5b5b5b50505600a165627a7a7230582015dd8a30edc4d2b88e51c1e252cdc5a08cd0159c2d5d7b063fdaad85d6e813e40029

Contract::walkAndConnectNodes never finishes executing because it keeps recursively calling itself. Not quite sure yet why.

Calling printBlockReferences just before, results in the following:

(dest = 0x00000000, numrefs = 0x00000000, refs = {}, JUMPI: 0x00000055, Default: 0x0000000B )
(dest = 0x0000000B, numrefs = 0x00000001, refs = {0x00000000}, JUMPI: 0x00000148, Default: 0x0000003F )
(dest = 0x0000003F, numrefs = 0x00000001, refs = {0x0000000b}, JUMPI: 0x0000017E, Default: 0x0000004A )
(dest = 0x0000004A, numrefs = 0x00000001, refs = {0x0000003f}, JUMPI: 0x000001B4, Default: 0x00000055 )
(dest = 0x00000055, numrefs = 0x00000002, refs = {0x000000000x0000004a}, Default: 0x00000059 )
(dest = 0x00000059, numrefs = 0x00000001, refs = {0x00000055}, JUMPI: 0x0000013D, Default: 0x000000B4 )
(dest = 0x000000B4, numrefs = 0x00000001, refs = {0x00000059}, Default: 0x00000143 )
(dest = 0x0000013D, numrefs = 0x00000001, refs = {0x00000059}, Default: 0x00000143 )
(dest = 0x00000143, numrefs = 0x00000002, refs = {0x000000b40x0000013d}, Default: 0x00000144 )
(dest = 0x00000144, numrefs = 0x00000001, refs = {0x00000143}, Default: 0xDEADBABE )
(dest = 0x00000146, numrefs = 0x00000000, refs = {}, Default: 0x00000000 )
(dest = 0x00000148, numrefs = 0x00000001, refs = {0x0000000b}, JUMPI: 0x00000150, Default: 0x0000014F , hash = 0x66117276, str = func_66117276, )
(dest = 0x0000014F, numrefs = 0x00000001, refs = {0x00000148}, Default: 0x00000150 )
(dest = 0x00000150, numrefs = 0x00000002, refs = {0x000001480x0000014f}, Default: 0x00000225 )
(dest = 0x0000017C, numrefs = 0x00000000, refs = {}, Default: 0x00000000 )
(dest = 0x0000017E, numrefs = 0x00000001, refs = {0x0000003f}, JUMPI: 0x00000186, Default: 0x00000185 , hash = 0x82C90AC0, str = func_82c90ac0, )
(dest = 0x00000185, numrefs = 0x00000001, refs = {0x0000017e}, Default: 0x00000186 )
(dest = 0x00000186, numrefs = 0x00000002, refs = {0x0000017e0x00000185}, Default: 0x000002C8 )
(dest = 0x000001B2, numrefs = 0x00000000, refs = {}, Default: 0x00000000 )
(dest = 0x000001B4, numrefs = 0x00000001, refs = {0x0000004a}, Default: 0x0000036B , hash = 0xB76EA962, str = func_b76ea962, )
(dest = 0x00000223, numrefs = 0x00000000, refs = {}, Default: 0x00000000 )
(dest = 0x00000225, numrefs = 0x00000001, refs = {0x00000150}, JUMPI: 0x00000282, Default: 0x0000027D )
(dest = 0x0000027D, numrefs = 0x00000001, refs = {0x00000225}, Default: 0x00000282 )
(dest = 0x00000282, numrefs = 0x00000002, refs = {0x000002250x0000027d}, Default: 0x000002C4 )
(dest = 0x000002C4, numrefs = 0x00000001, refs = {0x00000282}, Default: 0x000002C5 )
(dest = 0x000002C5, numrefs = 0x00000001, refs = {0x000002c4}, Default: 0xDEADBABE )
(dest = 0x000002C8, numrefs = 0x00000001, refs = {0x00000186}, JUMPI: 0x00000325, Default: 0x00000320 )
(dest = 0x00000320, numrefs = 0x00000001, refs = {0x000002c8}, Default: 0x00000325 )
(dest = 0x00000325, numrefs = 0x00000002, refs = {0x000002c80x00000320}, Default: 0x00000367 )
(dest = 0x00000367, numrefs = 0x00000001, refs = {0x00000325}, Default: 0x00000368 )
(dest = 0x00000368, numrefs = 0x00000001, refs = {0x00000367}, Default: 0xDEADBABE )
(dest = 0x0000036B, numrefs = 0x00000001, refs = {0x000001b4}, JUMPI: 0x000003C8, Default: 0x000003C3 )
(dest = 0x000003C3, numrefs = 0x00000001, refs = {0x0000036b}, Default: 0x000003C8 )
(dest = 0x000003C8, numrefs = 0x00000002, refs = {0x0000036b0x000003c3}, JUMPI: 0x0000041D, Default: 0x000003F9 )
(dest = 0x000003F9, numrefs = 0x00000002, refs = {0x000003c80x00000407}, JUMPI: 0x0000041D, Default: 0x00000407 )
(dest = 0x00000407, numrefs = 0x00000001, refs = {0x000003f9}, Default: 0x000003F9 )
(dest = 0x0000041D, numrefs = 0x00000002, refs = {0x000003c80x000003f9}, JUMPI: 0x00000449, Default: 0x00000430 )
(dest = 0x00000430, numrefs = 0x00000001, refs = {0x0000041d}, Default: 0x00000449 )
(dest = 0x00000449, numrefs = 0x00000002, refs = {0x0000041d0x00000430}, JUMPI: 0x0000046E, Default: 0x00000469 )
(dest = 0x00000469, numrefs = 0x00000001, refs = {0x00000449}, Default: 0x0000046E )
(dest = 0x0000046E, numrefs = 0x00000002, refs = {0x000004490x00000469}, Default: 0x0000046F )
(dest = 0x0000046F, numrefs = 0x00000001, refs = {0x0000046e}, Default: 0x00000470 )
(dest = 0x00000470, numrefs = 0x00000001, refs = {0x0000046f}, Default: 0xDEADBABE )
(dest = 0xDEADBABE, numrefs = 0x00000004, refs = {0x000001440x000002c50x000003680x00000470}, Default: 0x00000000 )

Which ends up in a loop between nodes 0x000003C8 -> 0x0000041D -> 0x00000449 -> 0x0000041D -> 0x000003C8 -> etc. So there's circular referencing going on, but I haven't been able to wrap my head around it yet.

After running it for a couple of iterations, this is the pattern that emerges:

CURRENT: 0000041D - NEXT: 0000046F - JUMPI: 00000000
CURRENT: 0000041D - NEXT: 00000470 - JUMPI: 00000000
CURRENT: 0000041D - NEXT: 00000223 - JUMPI: 00000000
CURRENT: 0000041D - NEXT: 00000000 - JUMPI: 00000000
CURRENT: 000003C8 - NEXT: 000003F9 - JUMPI: 00000000
CURRENT: 000003C8 - NEXT: 00000407 - JUMPI: 0000041D
CURRENT: 0000041D - NEXT: 00000430 - JUMPI: 00000449 <--\
CURRENT: 00000449 - NEXT: 00000469 - JUMPI: 0000046E	|
CURRENT: 0000046E - NEXT: 0000046F - JUMPI: 00000000	|
CURRENT: 0000046E - NEXT: 00000470 - JUMPI: 00000000	|
CURRENT: 0000046E - NEXT: 00000223 - JUMPI: 00000000	|
CURRENT: 0000046E - NEXT: 00000000 - JUMPI: 00000000	|
CURRENT: 00000449 - NEXT: 0000046E - JUMPI: 00000000	|
CURRENT: 00000449 - NEXT: 0000046F - JUMPI: 00000000	|
CURRENT: 00000449 - NEXT: 00000470 - JUMPI: 00000000	|
CURRENT: 00000449 - NEXT: 00000223 - JUMPI: 00000000	|
CURRENT: 00000449 - NEXT: 00000000 - JUMPI: 00000000	|
CURRENT: 0000041D - NEXT: 00000449 - JUMPI: 00000000	|
CURRENT: 0000041D - NEXT: 00000469 - JUMPI: 0000046E	|
CURRENT: 0000046E - NEXT: 0000046F - JUMPI: 00000000	|
CURRENT: 0000046E - NEXT: 00000470 - JUMPI: 00000000	|
CURRENT: 0000046E - NEXT: 00000223 - JUMPI: 00000000	|
CURRENT: 0000046E - NEXT: 00000000 - JUMPI: 00000000	|
CURRENT: 0000041D - NEXT: 0000046E - JUMPI: 00000000	|
CURRENT: 0000041D - NEXT: 0000046F - JUMPI: 00000000	|
CURRENT: 0000041D - NEXT: 00000470 - JUMPI: 00000000	|
CURRENT: 0000041D - NEXT: 00000223 - JUMPI: 00000000	|
CURRENT: 0000041D - NEXT: 00000000 - JUMPI: 00000000	|
CURRENT: 000003C8 - NEXT: 000003F9 - JUMPI: 00000000	|
CURRENT: 000003C8 - NEXT: 00000407 - JUMPI: 0000041D ---/
CURRENT: 0000041D - NEXT: 00000430 - JUMPI: 00000449
CURRENT: 00000449 - NEXT: 00000469 - JUMPI: 0000046E
CURRENT: 0000046E - NEXT: 0000046F - JUMPI: 00000000
CURRENT: 0000046E - NEXT: 00000470 - JUMPI: 00000000
CURRENT: 0000046E - NEXT: 00000223 - JUMPI: 00000000
CURRENT: 0000046E - NEXT: 00000000 - JUMPI: 00000000
@danslo
Copy link
Author

danslo commented Jul 31, 2017

@msuiche I'm happy to debug this further, but you probably have a better idea of what's going on given the information above. Let me know how/where I can help :)

@danslo
Copy link
Author

danslo commented Aug 1, 2017

On further examination, it's not due to recursion. But a simple circular reference between 0x407 and 0x3F9. Both their dstDefault's point to eachother. Not sure what it means :)

@msuiche msuiche self-assigned this Aug 2, 2017
msuiche added a commit that referenced this issue Aug 2, 2017
… through nodes to resolve orphan blocks.
@msuiche
Copy link
Owner

msuiche commented Aug 2, 2017

Fixed by c7ac851

@msuiche msuiche closed this as completed Aug 2, 2017
@danslo
Copy link
Author

danslo commented Aug 3, 2017

Cool, that fixes the infinite loop while resolving basic blocks, but now get's stuck in an infinite loop complaining about executeInstruction: NOT_IMPLEMENTED: REVERT, for the same bytecode.

@ytrezq
Copy link

ytrezq commented Jun 2, 2018

@msuiche it seems there’s regression as I’m have the exact same problem but with different code #50.

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