GraphicsLessonInGforth icon indicating copy to clipboard operation
GraphicsLessonInGforth copied to clipboard

Terminate-String word is unsafe

Open MaxBarraclough opened this issue 3 years ago • 3 comments

ANS Forth forbids modification of strings returned by the S" word (a.k.a. s-quote). (See also this discussion, ctrl-f for shall not alter.) This means that the Terminate-String word is non-compliant. More specifically, its intended use, in combination with S", is non-compliant.

I think the standard-compliant solution is to use the S\" word instead, where the \z sequence generates a null character, like '\0' in C, suitable for termination.

See also this StackOverflow thread, although he uses \0 rather than \z, which doesn't seem right.

From what I can see, ANS Forth offers no similar words for producing mutable strings. Perhaps a copy-based approach could also be made to work.

MaxBarraclough avatar Mar 07 '21 13:03 MaxBarraclough

@MaxBarraclough Thanks for your feedback. I'm a Forth beginner and my skills are less good as yours. In which file/line the returned string is modified?

Lecrapouille avatar Mar 08 '21 20:03 Lecrapouille

I'm not very experienced with Forth either, I was just lucky enough to spot that part of the spec and notice the issue.

My thinking is that if you use S\" with the \z escape-sequence, you should be able to get null-terminated strings directly from the literals without having to ever modify them. Perhaps the Terminate-String word could then be retired completely.

Here are two uses of s" and Terminate-String that could be replaced by s\":

MaxBarraclough avatar Mar 08 '21 23:03 MaxBarraclough

Thanks for the report ! Since I'm a beginner and mainly use these codes as inspiration and goals for my own forth, I prefer not touching the code and let a professional offering a pull request.

Lecrapouille avatar Mar 11 '21 00:03 Lecrapouille