justinmeza / lci

A LOLCODE interpreter written in C.
http://lolcode.org
GNU General Public License v3.0
784 stars 105 forks source link

SegFault when using STDIO Library #49

Open WuffyTopside opened 6 years ago

WuffyTopside commented 6 years ago

I'm using the future branch of lci, and whenever I run a program to write a YARN to a file, I get a Segmentation Fault. The Program is below:

HAI 1.4

CAN HAS STDIO?

I HAS A var ITZ "HAI!!!1!"

I HAS A file ITZ I IZ STDIO'Z OPEN YR "/usr/lol/file.txt" AN YR "r" MKAY

I IZ STDIO'Z DIAF YR file MKAY O RLY? YA RLY I IZ STDIO'Z SCRIBBEL YR file AN YR var MKAY NO WAI INVISIBLE "I can't open ur file!!!1!" OIC

I IZ STDIO'Z CLOSE YR file MKAY

KTHXBYE

leyarotheconquerer commented 6 years ago

It looks like the code might not be doing quite what you think it's doing, though, admittedly, it'd be nice if lci reported the errors more intuitively.

First, I HAS A file ITZ I IZ STDIO'Z OPEN YR "/usr/lol/file.txt" AN YR "r" MKAY roughly translates to fopen("/usr/lol/file.txt", "r"). Unix documentation ( http://man7.org/linux/man-pages/man3/fopen.3.html ) states that to write to a file, you'll need to open in "w" or "w+" mode rather than "r" mode.

Second, I think the error checking in this code is inverted. I IZ STDIO'Z DIAF YR file MKAY translates to ferror(file). This is wrapped in a translation to a TROOF, where WIN is an error and FAIL indicates no error.

All that to say, I think LCI is working correctly (although maybe those segfaults should be replaced by some legible error messages). Here's a potential fix for your code that seems to work for me:

HAI 1.4

CAN HAS STDIO?

I HAS A var ITZ "HAI!!!1!"

I HAS A file ITZ I IZ STDIO'Z OPEN YR "/usr/lol/file.txt" AN YR "w" MKAY

I IZ STDIO'Z DIAF YR file MKAY
O RLY?
YA RLY
INVISIBLE "I can't open ur file!!!1!"
NO WAI
I IZ STDIO'Z SCRIBBEL YR file AN YR var MKAY
OIC

I IZ STDIO'Z CLOSE YR file MKAY

KTHXBYE