{"id":1564,"date":"2014-12-01T01:53:06","date_gmt":"2014-12-01T01:53:06","guid":{"rendered":"http:\/\/41j.com\/blog\/?p=1564"},"modified":"2014-12-01T02:33:30","modified_gmt":"2014-12-01T02:33:30","slug":"lack-return-causes-abort-emscripten","status":"publish","type":"post","link":"https:\/\/41j.com\/blog\/2014\/12\/lack-return-causes-abort-emscripten\/","title":{"rendered":"Lack of return causes abort() in Emscripten"},"content":{"rendered":"<p>I received the following Javascript exception from some code compiled with Emscripten. The code was working correctly as a standalone C++ program. This confused me for a while:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\nuncaught exception: abort() at jsStackTrace@file:\/\/\/home\/new\/gitcode\/repeatanalysis\/progs\/r.js:1049:7\r\nstackTrace@file:\/\/\/home\/new\/gitcode\/progs\/r.js:1066:3\r\nabort@file:\/\/\/home\/new\/gitcode\/progs\/r.js:8368:3\r\n_llvm_trap@file:\/\/\/home\/new\/gitcode\/progs\/r.js:4960:7\r\n__Z15test_badret_auxiii &#x5B;test_badret_aux(int, int, int)]@file:\/\/\/home\/new\/gitcode\/repeatanalysis\/progs\/r.js:8079:2\r\n_test_badret@file:\/\/\/home\/new\/gitcode\/progs\/r.js:8089:2\r\nasm._test_badret@file:\/\/\/home\/new\/gitcode\/progs\/r.js:8148:1\r\nccallFunc@file:\/\/\/home\/new\/gitcode\/progs\/r.js:534:9\r\n@file:\/\/\/home\/new\/gitcode\/progs\/r.html:15:4\r\n<\/pre>\n<p>The cause was a non-void function failing to return a value. Here&#8217;s the complete example:<\/p>\n<p>#include &lt;iostream&gt;<br \/>\n#include &lt;fstream&gt;<br \/>\n#include &lt;vector&gt;<br \/>\n#include &quot;malloc.h&quot;<\/p>\n<p>using namespace std;<\/p>\n<p>int test_badret_aux(int arg1,int arg2,int arg3) {<br \/>\n \/\/ return 0;<br \/>\n}<\/p>\n<p>extern &quot;C&quot; {<br \/>\n   int test_badret(char *inputstring);<br \/>\n}<\/p>\n<p>int test_badret(char *inputstring) {<br \/>\n  test_badret_aux(1,100,100);<\/p>\n<p>  return 0;<br \/>\n}<\/p>\n<p>Compiled with (I tried a bunch of options):<\/p>\n<pre>\r\n emcc .\/r.cpp -o r.js -s EXPORTED_FUNCTIONS=\"['_test_badret']\" -s SAFE_HEAP=1 -g -s ASSERTIONS=1\r\n<\/pre>\n<p>And driven with the following html:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n &lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;body&gt;\r\n&lt;script src=&quot;r.js&quot;&gt;&lt;\/script&gt;\r\n\r\n&lt;script&gt;\r\n\r\nvar mystring = &quot;test&quot;;\r\nvar strptr = Module._malloc(mystring.length);\r\nModule.writeAsciiToMemory(mystring, strptr);\r\n\r\nvar ret = Module.ccall('test_badret', \/\/ name of C function\r\n  'number', \/\/ return type\r\n  &#x5B;'number'], \/\/ argument types\r\n  &#x5B;strptr]); \/\/ arguments\r\n\r\n&lt;\/script&gt;\r\n\r\n\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>If I uncomment the return in the above C program, the code no longer aborts. Understandable perhaps. But seemed unusual to me. This was using Firefox (Iceweasel 31.2.0 on Debian Jessie).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I received the following Javascript exception from some code compiled with Emscripten. The code was working correctly as a standalone C++ program. This confused me for a while: uncaught exception: abort() at jsStackTrace@file:\/\/\/home\/new\/gitcode\/repeatanalysis\/progs\/r.js:1049:7 stackTrace@file:\/\/\/home\/new\/gitcode\/progs\/r.js:1066:3 abort@file:\/\/\/home\/new\/gitcode\/progs\/r.js:8368:3 _llvm_trap@file:\/\/\/home\/new\/gitcode\/progs\/r.js:4960:7 __Z15test_badret_auxiii &#x5B;test_badret_aux(int, int, int)]@file:\/\/\/home\/new\/gitcode\/repeatanalysis\/progs\/r.js:8079:2 _test_badret@file:\/\/\/home\/new\/gitcode\/progs\/r.js:8089:2 asm._test_badret@file:\/\/\/home\/new\/gitcode\/progs\/r.js:8148:1 ccallFunc@file:\/\/\/home\/new\/gitcode\/progs\/r.js:534:9 @file:\/\/\/home\/new\/gitcode\/progs\/r.html:15:4 The cause was a non-void function failing to return a value. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-1564","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1RRoU-pe","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/posts\/1564","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/comments?post=1564"}],"version-history":[{"count":3,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/posts\/1564\/revisions"}],"predecessor-version":[{"id":1567,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/posts\/1564\/revisions\/1567"}],"wp:attachment":[{"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/media?parent=1564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/categories?post=1564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/41j.com\/blog\/wp-json\/wp\/v2\/tags?post=1564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}