#1310 Tcl_Eval() core dumps if passed a string literal script

obsolete: 8.2.2

OriginalBugID: 4215 Bug
Version: 8.2.2
SubmitDate: '2000-02-22'
LastModified: '2000-10-25'
Severity: MED
Status: UnAssn
Submitter: techsupp
OS: All
OSVersion: Irix 6.2/6.4/6.56, Redhat Linux 6.1
Machine: SGI Octane, Dell Pentium III
FixedDate: '2000-10-25'
ClosedDate: '2000-10-25'

Byron Biggs

tk, BLT, dp, tclX, Tktable, itcl, expect, img

plus patch

On Irix (SGI), Tcl packages written in C are linked by default with "-rdata_shared", which puts string-literal data into read-only memory. If a call is then made to Tcl_Eval() passing string literal data, the interpreter core dumps because Tcl_Eval calls Tcl_ParseCommand(), which then tries to modify the string. The offending line is:

* Temporarily overwrite the character just after the end of the
* string with a 0 byte. This acts as a sentinel and reduces the
* number of places where we have to check for the end of the
* input string. The original value of the byte is restored at
* the end of the parse.

savedChar = string[numBytes];
if (savedChar != 0) {
>>> string[numBytes] = 0;

Similar behavior is observed on Redhat Linux. The workaround is to not compile Tcl packages with -rdata_shared on Irix, or to add -fwritable-strings to gcc on Linux.

Note that the BLT package also is compiled by default with -rdata_shared/without -fwritable-strings, and this code contains calls to Tcl_Eval() which pass string literal data.

Tcl_Eval(interp,"mycommand") should not core dump when used in packages compiled with the default compile options.


  • Donal K. Fellows

    It is documented in the Tcl_Eval manpage that the string passed to it must exist in *writable* memory. Since you can always use Tcl_VarEval or (preferably) the Obj-based evaluation functions, nobody really feels like fixing this.

  • Donal K. Fellows

    • status: open --> closed-wont-fix
  • Don Porter

    Don Porter - 2001-04-18
    • labels: 104246 --> 45. Parsing and Eval