[fpc-devel] Constant arrays sometimes produce incorrect data tables

2005-08-13 Thread David Butler
Hi all

I picked up this weird code generation problem (it was also present in
2.0.0). I reported it as bug 4277 today. Unfortunately I can only
reproduce it in a specific context, so please e-mail me for the unit.

The problem is when you define an array of constant strings.

For example:

const
  RFCMonthNames : Array[1..12] of String = (
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');

is usually assembled as something like:

TC_P$TESTARRAY_RFCMONTHNAMES
DD _$PROGRAM$_L4, _$PROGRAM$_L5, _$PROGRAM$_L6, _$PROGRAM$_L7, ..
DD -1,3
_$PROGRAM$_L4: DB Jan,0 DD -1,3
_$PROGRAM$_L5: DB Feb,0 DD -1,3


which is correct, but the exact same code (in a different unit) is
compiled differently, causing access violations when accessed:

TC_CDATETIME_RFCMONTHNAMES
DD _$CDATETIME$_L2046
DD -1,3
_$CDATETIME$_L2046:
DB Jan,0
DD _$CDATETIME$_L2047
DD -1,3
_$CDATETIME$_L2047:
DB Feb,0
DD _$CDATETIME$_L2048
DD -1,3
_$CDATETIME$_L2048:
DB Mar,0
DD _$CDATETIME$_L2049
DD -1,3
_$CDATETIME$_L2049:
DB Apr,0



Regards
David


___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Constant arrays sometimes produce incorrect data tables

2005-08-13 Thread Anton Tichawa

David Butler wrote:


Hi all

I picked up this weird code generation problem (it was also present in
2.0.0). I reported it as bug 4277 today. Unfortunately I can only
reproduce it in a specific context, so please e-mail me for the unit.

The problem is when you define an array of constant strings.

For example:

const
 RFCMonthNames : Array[1..12] of String = (
   'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
   'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');

is usually assembled as something like:

TC_P$TESTARRAY_RFCMONTHNAMES
DD _$PROGRAM$_L4, _$PROGRAM$_L5, _$PROGRAM$_L6, _$PROGRAM$_L7, ..
DD -1,3
_$PROGRAM$_L4: DB Jan,0 DD -1,3
_$PROGRAM$_L5: DB Feb,0 DD -1,3


which is correct, but the exact same code (in a different unit) is
compiled differently, causing access violations when accessed:

TC_CDATETIME_RFCMONTHNAMES
DD _$CDATETIME$_L2046
DD -1,3
_$CDATETIME$_L2046:
DB Jan,0
DD _$CDATETIME$_L2047
DD -1,3
_$CDATETIME$_L2047:
DB Feb,0
DD _$CDATETIME$_L2048
DD -1,3
_$CDATETIME$_L2048:
DB Mar,0
DD _$CDATETIME$_L2049
DD -1,3
_$CDATETIME$_L2049:
DB Apr,0



Regards
David


___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

 

There are two kinds of strings, shortstrings (max. 256 bytes) and 
ansistrings (any length, allocated on the heap). May be they're mixed, 
because the declaration string might use a shortstring in one unit, an 
ansistring in another, depending on compiler switches like $H or 
$LONGSTRINGS.
Such mixing would very likely cause access violations. Try e. g. to 
change all declarations to shortstring, which is enough for short 
month names.


hth,

Anton.




___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel