delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2004/03/22/15:16:38

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
X-Trace-PostClient-IP: 68.147.131.211
From: Brian Inglis <Brian DOT Inglis AT SystematicSw DOT Invalid>
Newsgroups: comp.os.msdos.djgpp
Subject: Re: strange comparison error
Organization: Systematic Software
Message-ID: <dtgu50pfg2q36oqa394ep9gqnag1tt132g@4ax.com>
References: <opr49vxpzbwfff31 AT news DOT mad DOT ttd DOT net>
X-Newsreader: Forte Agent 1.93/32.576 English (American)
MIME-Version: 1.0
Lines: 75
Date: Mon, 22 Mar 2004 20:09:08 GMT
NNTP-Posting-Host: 24.71.223.147
X-Complaints-To: abuse AT shaw DOT ca
X-Trace: pd7tw3no 1079986148 24.71.223.147 (Mon, 22 Mar 2004 13:09:08 MST)
NNTP-Posting-Date: Mon, 22 Mar 2004 13:09:08 MST
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

On Mon, 22 Mar 2004 17:54:51 +0100 in comp.os.msdos.djgpp, Rafael
García <rafael-no_spam_please_ AT geninfor DOT com> wrote:

>I have got an error message today that I cannot reproduce in my working 
>machine. I don't understand what could cause it but perhaps some of you can 
>give me an idea.
>
>I have something like this:
>--------------------------------------------------------
>#define MAXFIELDS 5000
>...
>t_field *pcampo,*reg;
>int ncampo,relativo;
>...
>pcampo=reg+ncampo+relativo*nc;   // for example
remember C address arithmetic works in units of t_field: multiplies
ncampo+relativo*nc by sizeof t_field before adding to reg; are you
sure you need to multiply relativo by nc here? you are adding relativo
* nc t_field objects; how big is nc here? 

>...
>if (pcampo>reg+MAXFIELDS) {     // intercept huge (bad) values
multiplies MAXFIELDS by sizeof t_field before adding to reg

>   printf("Wrong field number: %d",(int)(pcampo-reg));
divides the difference between the addresses by sizeof t_field

>   return NULL; }
>do something with *pcampo
>---------------------------------------------------------
>Well, this is not complete but that is not the point because it doesn't 
>fail now. Nor it failed executing from RHIDE, when I tried to debug it with 
>a breakpoint. It only failed in the morning on a machine to which I cannot 
>get now.
>The problem is at the 'if'. It gave "Wrong field number: 14" but I can't 
>understand how can it be 14 pcampo-reg and go into de "if (pcampo>reg+5000) 
>". I did solve it changing to "if (pcampo-reg>MAXFIELDS)", but cannot 
>understand de difference.
should not be overflow, as scaled value of MAXFIELDS added should only
be about 450000-480000, although using the subtraction ensures that
the calculation works in units of t_field instead of bytes, so you're
less likely to overflow; once again, maybe look at the value of nc to
see if the earlier calculation of pcampo could have overflowed? 

>Perhaps that change didn't really solve it, but the mere recompilation 
>corrected something. I don't think so.
>
>Could you imagine something can affect this pointer arithmetic? This same 
>code is working regularly on other machines running many million times a 
>day.

>If you think the definition of 't_field' could be important, here it is 
>(without translation).
>
>typedef struct {  char *nombre;  int tam;
>   char *def;     int vdesp;     int hdesp;     char *buf;     unsigned 
>adoptamoneda:1;  #ifndef NOCACHEATR
>   BOOL sincacheatr;
>   int cacheatrlisto;
>   char *cacheatributos[NATRIBUTOSCACHEABLES];
>#endif
>   } t_campo;
>
>
>NOCACHEATR is undefined
>NATRIBUTOSCACHEABLES is something like 15
sizeof t_field/t_campo should be between 90-96 bytes, depending on
whether adoptamoneda and sincacheatr are compiled as byte sized or
word sized

-- 
Thanks. Take care, Brian Inglis 	Calgary, Alberta, Canada

Brian DOT Inglis AT CSi DOT com 	(Brian dot Inglis at SystematicSw dot ab dot ca)
    fake address		use address above to reply

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019