[mdlug] C Pointer Problem

Gregory Czerniak gregczrk at gmail.com
Fri Apr 10 20:40:32 EDT 2015


Hi Andrew,

    When dealing with C pointers, the & means "the address of," not a
bitwise AND.  However, I'm not 100% sure what peiGetConvKer(image)
would do since there's so much stuff happening at once.  My guess is
that it's finding the address of "image", dereferencing clientData[1]
(getting the integer), type-casting this integer as a double imageType
pointer, and then de-referencing.  By doing that, you'd end up with a
single imageType pointer pointing to whatever that integer value was.
This would work (mostly) fine on a 32-bit machine, but it would blow
up on a 64-bit machine.

Thanks,
Greg Czerniak

On Fri, Apr 10, 2015 at 1:16 PM, A. Zimmer <andrew.zimmer at comcast.net> wrote:
> Hello,
>
> I am attempting to convert a relatively ancient C program (ca. 1999)
> into 64-bit clean code that will run on a pure 64-bit Linux system.
> The program performs a certain type of digital image processing and it
> will run on a 32-bit or multilib (32/64-bit) system, but it will seg fault
> on pure 64-bit.
>
> So far I've converted all integer types and corrected all GCC compiler
> warnings and errors concerning 32-bit pointers.  The program will now
> compile without any problems but will always seg fault during run time.
> Using a debugger I've traced the seg faults to some unusual pointer
> casts that somehow cause trouble in 64-bit.
>
> Here are two places where segmentation faults occur.  These two functions
> are defined in a header file and are used to insert in-line functions
> at various places in the code:
>
> #define peiGetFlags(image)      (((imageType*)(image))->flags)
> #define peiGetConvKer(image)    (*(imageType**)&(image)->clientData[1])
>
> In these functions, "imageType" is a structure and "image" is a pointer
> to that structure.  The gcc compiler won't complain, but when called
> during run time the program seg faults.
>
> I cannot decipher the meaning of the constructs on the right-hand side.
>
> The first seems to cast a pointer into a pointer to imageType, which should
> not really be necessary since "image" is already of that type.  In fact,
> I can get past the seg fault by rewriting this as "(*image).flags."  But
> then why would the original author use this more complicated method?
>
> The second one has me totally baffled.  I can't even guess what that
> strange bit-AND is doing.
>
> Can someone shed some light on the meaning of these strange constructs?
>
> Here are two more examples:
>
> #define peiGetConvInt32Factor(image)    (*(int32_t*)&(image)->clientData[3])
> #define peiGetConvFloat64Factor(image)  (*(double*)&(image)->clientData[3])
>
> Also, for reference, here is the structure for which these functions are
> intended (most of the fields are int32_t):
>
> struct imageType {
>         imageOpsType *ops;
>         coordType width;
>         coordType height;
>         int32_t depth;                  /* 1..32                        */
>         int32_t linebytes;              /* bytes per line               */
>         int32_t allocated;              /* bytes allocated              */
>         pixelType fill;                 /* color to fill with           */
>         int8_t sign;
>         imageType *primary;             /* for secondary, assoc primary */
>         coordType primaryX;             /* for secondary, offset in primary */
>         coordType primaryY;             /* for secondary, offset in primary */
>         int8_t *data;
>         uint32_t flags;                 /* image access mode(s)         */
>         int32_t verbose;
>         int32_t page;                   /* number of the current page   */
>         double resX;                    /* pixels per unit in X         */
>         double resY;                    /* pixels per unit in Y         */
>         int32_t resUnit;                        /* 0=nores 1=unk 2=inch 3=cm    */
>         char modes[PEI_MAX_MODES];      /* modes used with open         */
>         char name[PEI_MAX_NAME];
>         int32_t clientData[PEI_CLIENT_SIZE]; };
>
>
> I can always run this code on a multi-lib (32/64-bit) system but I'd like
> to use pure 64-bit only.
>
> _______________________________________________
> mdlug mailing list
> mdlug at mdlug.org
> http://mdlug.org/mailman/listinfo/mdlug


More information about the mdlug mailing list