Merge pull request #249 from xexyl/1994-schnitzi

This commit is contained in:
Landon Curt Noll authored and GitHub committed 2023-04-01 14:20:20 -07:00
commit bf845a978d
3 files changed
+70 -9

No files matched your search

+9 -5
View File
@@ -14,11 +14,15 @@
./schnitzi < textfile
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed the entry to not
overflow the buffer (and segfault) by changing the call of `gets()` to
`fgets()`. He also increased the buffer size. Prior to this fix one could not
redirect the Makefile into this program, as an example problem. Thank you Cody
for your assistance!
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) increased the buffer
size from 100 to 10000. Changing it to use `fgets()` instead of `gets()` is more
problematic because when feeding the source code to the program the output
results in compiler errors and not only that but the gets() is still there in
the generated output. Even changing the buffer size can result in compilation
errors if not done correctly. The generated output also does not have a changed
buffer size. Changing it to use fgets() can happen later, maybe, but bigger
files can now be parsed by the original code. An example is this Makefile. Thank
you Cody!
## Try:
+4 -4
View File
@@ -20,12 +20,12 @@ h mh111 de{l) +di (+'( d+% c n+
*/ n = 0 ;
main ( ) {
char v [
1000 ] , s;
int t[100 ] ,
u[100 ] ; u
10000 ] , s;
int t[100 ] ,
u[100 ] ; u
[ 0
]=ftell(stdin ) ;
while(fgets(v,100,stdin )&&((v[strlen(v)-1]='\0',1)) )
while(gets (v ) )
{t [ r ]=
strlen (
v);y=
+57
View File
@@ -453,6 +453,63 @@ this simply does not work with them. Can you help us?
# 1994
## [1994/schnitzi](1994/schnitzi.c) ([README.md])(1994/schnitzi/README.md))
## STATUS: uses gets() - change to fgets() if possible
The original buffer size of this entry is 100 which is very easily overflowed
with `gets()` which it uses. [Cody Boone
Ferguson](/winners.html#Cody_Boone_Ferguson) changed the buffer size to 10000
but he notes a problem in that this does not translate to the generated source
file (when feeding the source itself). With `fgets()` it generates compiler
errors. Without special care with changing the buffer size it would also
generate compiler errors. Cody explains the magic below which might be used to
change this entry to fgets() (and he'll be working on it in the coming days most
likely).
### The magic of the entry
Take a look at the interesting comment as well as the `int r=0,x,y=0` at the top
of the file. If you look at each column go down that column you can see how it
spells out the code. For instance the first column looks like:
```
i
n
c
l
u
d
e
<
s
t
d
i
o
.
h
>
```
If you join the lines you end up with:
```c
#include <stdio.h>
```
If you look at column 25 which is the end of the word 'mh111' and you go down to
the next row you'll see a 0 and if you go one row down another 0. This is the
buffer size, 100, for `u`. The column to the left is the same for the `t`
variable.
Thus it seems that in order to get the generated output correct one needs to
provide the correct input in comments or possibly by rearranging some of the
code (this was required to make the generated code compile at all when changing
the buffer size).
# 1995