From: Bernhard H. <ber...@be...> - 2003-05-11 17:47:12
|
AFAIK the contents of the internal RAM is undefined after a power up reset. Therefore all global or static variables must be initialized, even if they are zero and in IRAM. If the the whole IRAM is filled with $a5 by adding the line fill iram 0 0xff 0xa5 to uCsim.cmd, a lot of tests will fail. zeropad_storage_idata.c struct x { short a; char b[10]; }; struct x idata teststruct[3] = { { 10, { 1, 2, 3, 4, 5} }, { 20, { 11 } }, { 30, { 6, 7, 8} } }; The padbytes are not initialized to 0. bug-227710.c struct { unsigned char index; } s; s.index isn't initialized to 0. Please correct me, if I'm wrong. Otherwise I'll file a bug report. Bernhard |
From: Johan K. <joh...@id...> - 2003-05-11 20:08:01
|
> The padbytes are not initialized to 0. Are they supposed to be? In code space they are now padded with zero's, but as far as I know I might have padded them with 0xAA as well; as long as they are padded. > Please correct me, if I'm wrong. Otherwise I'll file a bug report. uninitialsed is undefined ? Johan |
From: Bernhard H. <ber...@be...> - 2003-05-11 21:10:59
|
> uninitialsed is undefined ? I'm absolutely sure, that global or static variables must be initialised to 0 by the compiler, see 2. example (bug-227710.c). I'm not sure about pad bytes. Are there any ANSI experts around? Bernhard |
From: Tim W. <sdc...@wo...> - 2003-05-12 22:02:51
|
On Sun, 11 May 2003, Bernhard Held wrote: > > uninitialsed is undefined ? > I'm absolutely sure, that global or static variables must be initialised to 0 > by the compiler, see 2. example (bug-227710.c). > > I'm not sure about pad bytes. > > Are there any ANSI experts around? > What do you mean by pad bytes? char x[10]="d"; x[1] through x[9] are all zero. struct tag { char c; long l; } x; where alignment means there is a pad byte between c and l (or at the end of the structure), the value of the pad byte is undefined. union tag { char c; long l; } x; x.c = 0; the first element of a union is initialized to zero x.l undefined. You cannot read a member of a union except through the member last written to. HTH Regards, Tim. -- God said, "div D = rho, div B = 0, curl E = - @B/@t, curl H = J + @D/@t," and there was light. http://tjw.hn.org/ http://www.locofungus.btinternet.co.uk/ |
From: Borut R. <bor...@si...> - 2003-05-13 05:23:15
|
This is from the ISO/IEC 9899 standard: "If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then: - if it has pointer type, it is initialized to a null pointer; - if it has arithmetic type, it is initialized to (positive or unsigned) zero; - if it is an aggregate, every member is initialized (recursively) according to these rules; - if it is a union, the first named member is initialized (recursively) according to these rules." Usually this is done in the way, that everyhing in the data segment, which is not initialized explicitly, is initialized to zero. This includes also padding bytes. But it is not required by the standard. Borut |
From: Bernhard H. <Ber...@be...> - 2003-05-13 11:54:59
|
Thanks for all replies! I'm afraid, that we used the term "pad bytes" in a wrong way. Nevertheless SDCC doesn't conform to the standard: I've filed a bug report. Thanks, Bernhard |