Search code examples
matlabmatlab-deploymentmatlab-engine

MATLAB Engine: engEvalString() won't return if given incomplete input


I'm using the MATLAB Engine C interface on OS X. I noticed that if engEvalString() is given an incomplete MATLAB input such as

engEvalString(ep, "x=[1 2");

or

engEvalString(ep, "for i=1:10");

then the function simply never returns. The quickest way to test this is using the engdemo.c example which will prompt for a piece of MATLAB code and evaluate it (i.e. you can type anything).

My application lets the user enter arbitrary MATLAB input and evaluate it, so I can't easily protect against incomplete input. Is there a workaround? Is there a way to prevent engEvalString() from hanging in this situation or is there a way to check an arbitrary piece of code for correctness/completeness before I actually pass it to MATLAB?


Solution

  • As you noted, it seems this bug is specific to Mac and/or Linux (I couldn't reproduce it on my Windows machine). As a workaround wrap the calls in eval, evalc, or evalin:

    engEvalString(ep, "eval('x = [1,2')")
    

    Furthermore, an undocumented feature of those functions is that they take a second input that is evaluated in case an error occurs in the first one. For example:

    ERR_FLAG = false;
    eval('x = [1,2', 'x=nan; ERR_FLAG=true;')
    

    You can trap errors that way by querying the value of a global error flag, and still avoid the bug above...