Please consider a donation to the Higher Intellect project. See https://preterhuman.net/donate.php or the Donate to Higher Intellect page for more info. |
Apparent bug with dbx on SGI IRIX
I am using dbx version 7.3 MR 55458 on IRIX Release 6.5 IP27. I am programming in C++ and compiling using CC. I have noticed that the following code
unsigned short A, **B; unsigned long X, Y; /* memory allocation and filling array with values Code added for memory allocation and value assignment */ A = B[Y][X];
results in the following
dbx> p B[Y][X], A dbx> 910, 230
Note that I break and check the values just after the statement
A = B[Y][X];
but the value in B[Y][X] has not been assigned to A. Is there a bug in the way the values are assigned or in the way they are reported? Note also that
dbx> p (A==B[Y][X]) results in dbx> 0
I would be grateful if anyone could tell me what is causing this problem.
Here is my complete compile command line.
CC -g -c ImageProcessing.cpp
I don't know if this would have any bearing on the problem but the problem is caused in a library file that is made as follows.
ar vr /usr/users/plikonen/lib/libImage.a ImageProcessing.o
The calling routine is compiled using the same arguments as the library files.
Response
Here is a small example that shows things working properly:
(dbx) n Process 3100 (t) stopped at [::main:28 ,0x10001348] 28 B[Y][X] = 930; (dbx) p B[Y][X], A 0 230 (dbx) n Process 3100 (t) stopped at [::main:30 ,0x1000137c] 30 A = B[Y][X]; (dbx) p B[Y][X], A 930 230 (dbx) n Process 3100 (t) stopped at [::main:32 ,0x100013b0] 32 printf("%d %d\n",A,B[Y][X]); (dbx) !p (!p = p B[Y][X], A) 930 930 Here is the test program: proton 44% cat t.cxx #include <stdio.h> #include <strings.h> #include <malloc.h> unsigned short A, **B; unsigned long X, Y; #define LIMX 15 #define LIMY 20 int main() { int A = 230; X = LIMX-5; Y = LIMY-5; B = (unsigned short **)malloc(LIMY*sizeof(*B) ); bzero(B,LIMY*sizeof(*B)); B[Y] = (unsigned short *)malloc(LIMX*sizeof(unsigned short)); bzero(B[Y],LIMX*sizeof(unsigned short)); B[Y][X] = 930; A = B[Y][X]; printf("%d %d\n",A,B[Y][X]); return 0; }
The compile command is: CC -g -n32 t.cxx -o t
All works exactly as it should as far as I can tell. You don't give a *complete* test case, so I supply one here. I don't recall you mentioning (in response to Walter Roberson's reply) for sure which ABI you compile for, so I guessed but made the -n32 explicit for clarity.
I tried it with 7.2.1 and 7.3.1.2 (not yet released). IRIX 6.5.5 and IRIX 6.5.9 not on exactly the same releases as you did, but... this is very basic stuff.
I give the complete dbx script to make it clear dbx displays the source line *to be executed next*.
Note that the above command is incorrect. For C++ files to go into archives with 7.3, you should be using
CC -ar /usr/users/plikonen/lib/libImage.a ImageProcessing.o
as is documented (but I don't recall just where ...).
For C or Fortran (f77 or f90) objects the ar command is fine. But C++ has all these special things like templates, constructors, etc etc, and plain ar(1) does not, in general, do the right things on C++ objects.
I have no reason to think this command error has any bearing on the original question, though.