Thread overview | ||||||
---|---|---|---|---|---|---|
|
March 08, 2003 Weird int/long arithmetic errors (overwriting memory?) | ||||
---|---|---|---|---|
| ||||
I ran into this when porting the sieve shootout benchmark. Here is the code with comments added. When I run this I get an array bounds exception. This code works in C. Maybe it's just something I don't understand about D, but it's a very subtle error. I had to change two of the variables to int's instead of long's to fix the error. Since there are no pointers being used it's weird that this error could even occur. Unfortunatly I was not able to isolate the problem any more than this. If I take out any of the code then everything starts working. //************************************************************ import string; int main(char[][] args) { int n = string.atoi(args[1]); static char flags[8192 + 1]; long i, k; //*** THESE MUST BE CHANGED TO int TO FIX THE PROBLEM int count = 0; try { while (n--) { count = 0; for (i = 2; i <= 8192; i++) flags[i] = 1; for (i = 2; i <= 8192; i++) { if (flags[i]) { //*** WHEN i==123 AND k==0 THIS WILL TRY TO ACCESS // ELEMENT 8241 (?!) AND THROW EXCEPTION (SHOULD // NOT HAPPEN?) for (k = i+i; k <= 8192; k += i) flags[k] = 0; count++; } } } printf("Count: %d\n", count); } catch { printf("Exception: %d\n", k); } return(0); } //************************************************************ Is it just me, or what? -- // DDevil |
March 08, 2003 Re: Weird int/long arithmetic errors (overwriting memory?) | ||||
---|---|---|---|---|
| ||||
Posted in reply to DDevil | DDevil wrote:
> I ran into this when porting the sieve shootout benchmark.
>
> Here is the code with comments added. When I run this I get an array bounds exception. This code works in C. Maybe it's just something I don't understand about D, but it's a very subtle error. I had to change two of the variables to int's instead of long's to fix the error. Since there are no pointers being used it's weird that this error could even occur.
long is a 64-bit type in D! Use int. Otherwise, your problem isn't reproduceable here. Are you using DMD 0.58?
|
March 08, 2003 Re: Weird int/long arithmetic errors (overwriting memory?) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Burton Radons | Burton Radons wrote:
> long is a 64-bit type in D! Use int. Otherwise, your problem isn't reproduceable here. Are you using DMD 0.58?
I'm using DMD 0.59. I might give 0.58 a shot to see if I still get the error.
I understand that it's a 64-bit type, but I would think that it should convert to/from 32-bit types or if not then the compiler should issue an error (?).
Interesting that it can't be reproduced. Are you using DMD 0.59?
Thanks!
--
// DDevil
|
March 08, 2003 Re: Weird int/long arithmetic errors (overwriting memory?) | ||||
---|---|---|---|---|
| ||||
Posted in reply to DDevil | DDevil wrote: > Burton Radons wrote: > >> long is a 64-bit type in D! Use int. Otherwise, your problem isn't reproduceable here. Are you using DMD 0.58? > > I'm using DMD 0.59. I might give 0.58 a shot to see if I still get the error. > > I understand that it's a 64-bit type, but I would think that it should convert to/from 32-bit types or if not then the compiler should issue an error (?). It does, and implicitly. This is a code generation error. > Interesting that it can't be reproduced. Are you using DMD 0.59? Walter didn't announce 0.59, so I didn't know about it. I confirm that 0.59 causes your code to crash when compiling it with "dmd -O foo.d"; "dmd foo.d" produces the correct code. |
Copyright © 1999-2021 by the D Language Foundation