home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #31 / NN_1992_31.iso / spool / comp / lang / tcl / 2252 < prev    next >
Encoding:
Internet Message Format  |  1992-12-26  |  2.7 KB

  1. Xref: sparky comp.lang.tcl:2252 gnu.gcc.bug:3057
  2. Path: sparky!uunet!spool.mu.edu!olivea!mintaka.lcs.mit.edu!ai-lab!prep.ai.mit.edu!gnulists
  3. From: madere@austin.ibm.com (Steve Madere)
  4. Newsgroups: comp.lang.tcl,gnu.gcc.bug
  5. Subject: Tcl 6.4 Tcl_ParseVar bug OR gcc 2.2.2 bug?
  6. Message-ID: <BzMCBy.2IB7@austin.ibm.com>
  7. Date: 21 Dec 92 16:55:10 GMT
  8. Followup-To: comp.lang.tcl,gnu.gcc.bug
  9. Organization: IBM Austin
  10. Lines: 67
  11. Approved: info-gnu@prep.ai.mit.edu
  12. To: gnu-gcc-bug@uunet.uu.net
  13. Originator: madere@julius.austin.ibm.com
  14.  
  15. When I call Tcl_Eval() repeatedly using string constants as code
  16. arguments, it causes a segmentation violation.  This occurs when
  17. Tcl_ParseVar overwrites individual characters of my string constant
  18. with a null (to mark the end of a local string) during parsing.
  19.  
  20.  
  21. The following code causes a segmentation violation in Tcl_ParseVar:
  22. I am using gcc 2.2.2 on an RS6000.
  23.  
  24.  
  25. Tcl_Eval(interp, "proc process_query {query} {\n"\
  26.             "  set qnum [lindex $query 0]\n"\
  27.             "  set request [lindex $query 1]\n"\
  28.             "  puts stdout \"query is $query\"\n"\
  29.             "  puts stdout \"qnum is $qnum\"\n"\
  30.             "  puts stdout \"request is $request\"\n"\
  31.             "  set result [eval $request]\n"\
  32.             "  puts stdout \"result is $result\"\n"\
  33.             "  return [list $qnum $result]\n"\
  34.             "}\n",0,NULL);
  35. Tcl_Eval(interp, "set result [process_query $query]\n",0,NULL);
  36. Tcl_Eval("ksend $queue_server queue_result $result\n",0,NULL);
  37.  
  38. -----------
  39.  
  40. segmentation violation at tclParse.c: 1165
  41.     *name1End = 0;
  42.  
  43. -----------
  44.  
  45. However, when I merely change to using "malloced" memory to hold
  46. my code fragments.  Everything works fine.
  47.  
  48.   c1=strdup("proc process_query {query} {\n"\
  49.             "  set qnum [lindex $query 0]\n"\
  50.             "  set request [lindex $query 1]\n"\
  51.             "  puts stdout \"query is $query\"\n"\
  52.             "  puts stdout \"qnum is $qnum\"\n"\
  53.             "  puts stdout \"request is $request\"\n"\
  54.             "  set result [eval $request]\n"\
  55.             "  puts stdout \"result is $result\"\n"\
  56.             "  return [list $qnum $result]\n"\
  57.             "}\n");
  58.   c2=strdup("set result [process_query $query]\n");
  59.   c3=strdup("ksend $queue_server queue_result $result\n");
  60.  
  61.   Tcl_Eval(interp,c1,0,NULL);
  62.   Tcl_Eval(interp,c2,0,NULL);
  63.   Tcl_Eval(interp,c3,0,NULL);
  64.  
  65. -------------
  66.  
  67. The man page for Tcl_Eval() does not warn the user about this
  68. sort of problem.  Should I never pass a string constant to this
  69. function or has my C compiler gone bonkers?
  70.  
  71.  
  72. My inbound mail is temporarily messed up so please post replies.
  73.  
  74. Thanks.
  75.  
  76. Steve Madere
  77. -- 
  78.  
  79. Steve Madere
  80. (Do not reply with R! use the following address)
  81. madere%aixserv@uunet.uu.net
  82.