On Sat, Oct 09, 2010 at 06:36:55PM +0200, merlyn wrote: > Hi all, > > I'm facing really weird behavior of simple C program > running under OpenBSD (4.7 and CURRENT). > > The code follows. The output also. The file to test the program with > is also inline attached. > > The decomp procedure reads input, writes it to the stdout. All 4-chars > preceeded by number are printer number times (e.g. 4abcd -> > abcdabcdabcdabcd). > > ./a.c < test_file.txt > should have output > aaaaa bb > ccccccccccc dddd > > however it sometimes ( 1 from 3 tryies, sometimes 1 from 20 or even 1 > from 40) > > looks like > aaaaa bb > ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc > cccccccccccccccccccccccccccccccccccccc > dddd > > > I've tryied this code with OpenBSD 4.7, OpenBSD CURRENT, CentOS Linux, > FreeBSD 8.0 (all i386 arch), but the problem occurs only at OpenBSD (both > versions). > > Does anyone know please where could be the problem? Because I have > really no idea. > > Thanks a lot, > Milan Bartos > > > > ---- CODE --- > > #include <stdio.h> > #include <stdlib.h> > > void decomp(unsigned int N){ > char *pole; > pole=malloc( sizeof(char) * N ); > char character; > int i,j; > int counter; > while( (character = getchar()) != EOF){
getchar() returns 'int' not 'char'. isdigit() and putchar() take 'int' not 'char'. > if( isdigit(character) ){ > counter=atoi(&character); atoi() takes a pointer to a string, not a pointer to a single characer. Results will depend on the 'random' stack garbage in the following variables i and j. Or possibly the random stack garbage of any alignment gaps on the stack. 'int i = 0, j;' may make it work predictably but is the wrong answer. > for( i=0 ; i < N ; i++){ > pole[i]=getchar(); > } Checking for EOF here is probably a good idea. Never trust input. :-). > for( i=0 ; i < counter ; i++){ > for( j=0 ; j < N ; j++){ > putchar(pole[j]); > } > } > > } > else { > putchar(character); putchar() can fail, so checking that for EOF is also good, paranoid practice. .... Ken