Re[7]: функция shmat: HP-UNIX 64 bit
От: Andriy Melnyk Украина  
Дата: 21.05.09 09:35
Оценка: 5 (2)
Здравствуйте, Димчанский, Вы писали:

Д>Я убрал все кастинги, компилится с предупреждением:

Д>warning: assignment makes pointer from integer without a cast
Д>Падает по той же причине.

Такое впечатление что компилер видит shmat как int shmat (...)

А если сделать явную декларацию функции?

extern void *shmat(int shmid, void *shmaddr, int shmflg);
функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 20.05.09 13:13
Оценка:
Пытаюсь закомпилить на новой платформе Itanium64 старые C-файлы, которые в каменный век кем-то писались под HP-UNIX на RISC платформе. Все как бы собралось, но проблема в вываливании в core dump в одном месте, где используется shared memory.

typedef struct SHMReg
{
    char a[11];
    int b;
    int c;
} MyReg;

MyReg *Reg;

...
// в одном из мест делается присваивание
// gcc на нем предупреждает: 
//   warning: cast to pointer from integer of different size
//   warning: assignment from incompatible pointer type
Reg = (struct MyReg*)shmat(shmid, NULL, 0); // возвращает 0x57ca000

В Reg заносится странное для меня число-указатель.
И потом в первом же месте, где пытаемся работать с Reg, вываливаемся c core dump:

Program received signal SIGSEGV, Segmentation fault
si_code: 1 — SEGV_MAPERR — Address not mapped to object.

Есть подозрение, что функция shmat как-то не так используется.
Где грабли?
Re: функция shmat: HP-UNIX 64 bit
От: Dmi3S Россия http://dmi3s.blogspot.com/
Дата: 20.05.09 14:22
Оценка:
Здравствуйте, Димчанский, Вы писали:

Д>Пытаюсь закомпилить на новой платформе Itanium64 старые C-файлы, которые в каменный век кем-то писались под HP-UNIX на RISC платформе. Все как бы собралось, но проблема в вываливании в core dump в одном месте, где используется shared memory.


Д>[ccode]

Д>typedef struct SHMReg
Д>{
Д> char a[11];
Д> int b;
Д> int c;
Д>} MyReg;

Д>MyReg *Reg;


Д>...


Д>И потом в первом же месте, где пытаемся работать с Reg, вываливаемся c core dump:

Д>

Program received signal SIGSEGV, Segmentation fault
Д> si_code: 1 — SEGV_MAPERR — Address not mapped to object.

Д>Есть подозрение, что функция shmat как-то не так используется.
Д>Где грабли?

Не спец в HP-UNIX и Itanium64, но вызывает подозрение вот это: char a[11];, т.к. вообще-то

Необходимо учитывать, что сегмент разделяемой памяти, пристыковываемый таким способом, может быть в разных процессах пристыкова к разным адресам. Поэтому все указатели в области разделяемой памяти должны быть не абсолютными, а относительными (как правило относительно адреса начала сегмента).

Случайно не на обращении ли к "a" вылетает?
Re[2]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 20.05.09 14:30
Оценка:
Здравствуйте, Dmi3S, Вы писали:

DS>Не спец в HP-UNIX и Itanium64, но вызывает подозрение вот это: char a[11];, т.к. вообще-то

DS>

DS>Необходимо учитывать, что сегмент разделяемой памяти, пристыковываемый таким способом, может быть в разных процессах пристыкова к разным адресам. Поэтому все указатели в области разделяемой памяти должны быть не абсолютными, а относительными (как правило относительно адреса начала сегмента).

DS>Случайно не на обращении ли к "a" вылетает?

m[10] = 0x00;
// вылетает на строке ниже
strcpy(Reg->а, m); // m - строка: char m[11];

Пытался в GDB смотреть:
p Reg->a

говорит:

Error accessing memory address 0x57ca000: Bad address.

Обращения к другим полям приводят к тому же.
Re[3]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 20.05.09 14:57
Оценка:
Здравствуйте, Димчанский, Вы писали:

Д>Обращения к другим полям приводят к тому же.


Чтение по тому адресу в отладчике приводит к тому же:
p (char*)Reg

$2 = 0x57ca000 <Error reading address 0x57ca0000: Bad address>


Проблема в возращенном адресе, похоже.
Re[4]: функция shmat: HP-UNIX 64 bit
От: Dmi3S Россия http://dmi3s.blogspot.com/
Дата: 20.05.09 15:26
Оценка:
Здравствуйте, Димчанский, Вы писали:

Д>Чтение по тому адресу в отладчике приводит к тому же:

Д>

Д>$2 = 0x57ca000 <Error reading address 0x57ca0000: Bad address>


Д>Проблема в возращенном адресе, похоже.


Ох, тогда не знаю, честно говоря. Хотя, варнинг при компиляции странный, да.
Re: функция shmat: HP-UNIX 64 bit
От: Andriy Melnyk Украина  
Дата: 20.05.09 16:20
Оценка:
Здравствуйте, Димчанский, Вы писали:

Д>Пытаюсь закомпилить на новой платформе Itanium64 старые C-файлы, которые в каменный век кем-то писались под HP-UNIX на RISC платформе. Все как бы собралось, но проблема в вываливании в core dump в одном месте, где используется shared memory.


Д>
Д>typedef struct SHMReg
Д>{
Д>    char a[11];
Д>    int b;
Д>    int c;
Д>} MyReg;

Д>MyReg *Reg;

Д>...
Д>// в одном из мест делается присваивание
Д>// gcc на нем предупреждает: 
Д>//   warning: cast to pointer from integer of different size
Д>//   warning: assignment from incompatible pointer type
Д>Reg = (struct MyReg*)shmat(shmid, NULL, 0); // возвращает 0x57ca000 
Д>

Д>В Reg заносится странное для меня число-указатель.
Д>И потом в первом же месте, где пытаемся работать с Reg, вываливаемся c core dump:
Д>

Program received signal SIGSEGV, Segmentation fault
Д> si_code: 1 — SEGV_MAPERR — Address not mapped to object.

Д>Есть подозрение, что функция shmat как-то не так используется.
Д>Где грабли?

Думаю варнинги в помощь. Возможно shmat скомпилирована как 32-bit версия и возвращает некоректное значение.

assign 32-bit hex constant to int or pointer -- invalid address (possible dereference errors)

Porting source code to HP-UX
Re[2]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 20.05.09 17:29
Оценка:
Здравствуйте, Andriy Melnyk, Вы писали:

AM>Думаю варнинги в помощь. Возможно shmat скомпилирована как 32-bit версия и возвращает некоректное значение.


AM>assign 32-bit hex constant to int or pointer -- invalid address (possible dereference errors)


AM>Porting source code to HP-UX


Но это системная функция, на сколько я понимаю.
man shmat
Компилил все с указанием -mlp64 ключа.
Re[3]: функция shmat: HP-UNIX 64 bit
От: Andriy Melnyk Украина  
Дата: 21.05.09 07:43
Оценка:
Здравствуйте, Димчанский, Вы писали:

Д>Но это системная функция, на сколько я понимаю.

Д>man shmat
Д>Компилил все с указанием -mlp64 ключа.

Системная функция тоже может быть 32 или 64 бита. Нужно проверить это.

Д>// gcc на нем предупреждает:

Д>// warning: cast to pointer from integer of different size
Д>// warning: assignment from incompatible pointer type

Здесь есть проблема еще на этапе компиляции. Очень похоже, что в shmat declaration возвращается 32 битовое значение. Проверте shm.h на возможные 64 bits defines.
Re[4]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 21.05.09 08:19
Оценка:
Здравствуйте, Andriy Melnyk, Вы писали:

AM>Здесь есть проблема еще на этапе компиляции. Очень похоже, что в shmat declaration возвращается 32 битовое значение. Проверте shm.h на возможные 64 bits defines.


Как-то особых дефайнов для 32-х и 64-х бит не нашел.
/usr/include/sys/shm.h:
/* @(#) shm.h $Date: 2004/08/05 11:42:17 $Revision: i380/3 PATCH_11.23 (PHKL_31500) */
/* (C) Copyright 2004 Hewlett-Packard Development Company, L.P. */
/*
 * BEGIN_DESC
 * 
 *  File: 
 *      @(#)    common/sys/shm.h        $Revision: $
 * 
 *  Purpose:
 *    IPC Shared Memory Facility.
 * 
 *  Classification:            Release to Release Consistency Req:
 *        <<please select one of the following:>>
 *     kernel subsystem private        none
 *     kernel private                none
 *     kernel 3rd party private        limited source
 *     public                    binary & source
 * 
 *  BE header:  yes
 *
 *  Shipped:  yes
 *    /usr/include/sys/shm.h
 *    /usr/conf/sys/shm.h
 *
 *  <<please delete the following note if this is a "public" header>>
 *  NOTE:
 *    This header file contains information specific to the internals
 *    of the HP-UX implementation.  The contents of this header file
 *    are subject to change without notice.  Such changes may affect
 *    source code, object code, or binary compatibility between
 *    releases of HP-UX.  Code which uses the symbols contained within
 *    this header file is inherently non-portable (even between HP-UX
 *    implementations).
 * 
 * END_DESC  
*/


#ifndef _SYS_SHM_INCLUDED
#define _SYS_SHM_INCLUDED

#include <sys/stdsyms.h>

#ifdef _INCLUDE_XOPEN_SOURCE
#  include <machine/sys/param_shm.h>
#  include <sys/types.h>
#  include <sys/ipc.h>

   /* The define for SHMLBA moved to machine/sys/param_shm.h. See comment there */
   /* The return value on failure of the shmat(2) system call */
#  define SHM_FAILED    (void *)-1L

   /*
   **    Shared Memory  Operation Flags.
   */

#  define SHM_RDONLY    010000    /* attach read-only (else read-write) */
#  define SHM_RND    020000    /* round attach address to SHMLBA */

   /*
   **    Types.
   **    Re-name old and keep both for backward compatibilty
   */
#  ifndef _SHMATT_T
#    define _SHMATT_T
     typedef unsigned short int __shmatt16_t;
     typedef unsigned int shmatt_t;
#  endif /* _SHMATT_T */

   /*
   **    Structure Definitions.
   */

   /*
   **    There is a shared mem ID data structure for each segment in the system.
   **
   **    Note: Do not change the order of the fields or the size of the
   **          structure.  Otherwise, object code compatibility will be broken.
   **/

struct shmid_ds {
        struct ipc_perm    shm_perm;    /* operation permission struct */
#if defined(_KERNEL) || defined(__LP64__) ||  (_XOPEN_SOURCE - 0L >= 500)
    size_t        shm_segsz;    /* size of segment in bytes */
#else  /* ! _KERNEL && !__LP64__ && !XPG5+ */
    int        shm_segsz;    /* size of segment in bytes */
#  endif
#ifdef _HPUX_SOURCE
        struct vas    *shm_vas;       /* virtual address space this entry */
#else
        struct __vas    *shm_vas;       /* virtual address space this entry */
#endif
#ifdef _CLASSIC_ID_TYPES
    unsigned short  shm_filler_lpid;
    unsigned short  shm_lpid;    /* pid of last shmop */
    unsigned short  shm_filler_cpid;
    unsigned short  shm_cpid;    /* pid of creator */
#else
    pid_t        shm_lpid;    /* pid of last shmop */
    pid_t        shm_cpid;    /* pid of creator */
#endif
/*
 * Re-name old and keep both for backward compatibilty
 */
        __shmatt16_t    __shm16_nattch;    /* current # attached (accurate) */
        __shmatt16_t    __shm16_cnattch;/* in memory # attached (inaccurate) */

        time_t        shm_atime;    /* last shmat time */
        time_t        shm_dtime;    /* last shmdt time */
        time_t        shm_ctime;    /* last change time */

        shmatt_t    shm_nattch;    /* NEW current # attached (accurate) */
        shmatt_t    shm_cnattch;    /* NEW in memory # attached (inaccurate) */
        char        shm_pad[16];    /* room for future expansion */
};
#      define _SHMID_DS_T


   /* Function prototypes */

#  ifndef _KERNEL
#  ifdef __cplusplus
     extern "C" {
#  endif /* __cplusplus */

#  if defined(__ia64) && !defined(_LIBC)  
    /* pragmas needed to support -B protected */  
#    pragma extern shmat, shmctl, shmdt, shmget
#  endif /* __ia64 && ! _LIBC */ 

#  ifdef _PROTOTYPES
     extern void *shmat(int, const void *, int);
     extern int shmctl(int, int, struct shmid_ds *);
     extern int shmdt(const void *);
#   if defined(_XPG2) || defined(_XPG3)
     extern int shmget(key_t, int, int);
#   else /* not (_XPG2 || _XPG3) */
     extern int shmget(key_t, size_t, int);
#endif /* not (_XPG2 || _XPG3) */
#  else /* not _PROTOTYPES */
#   ifdef _CLASSIC_XOPEN_TYPES
     extern char *shmat();
#   else
     extern void *shmat();
#   endif
     extern int shmctl();
     extern int shmdt();
     extern int shmget();
#  endif /* not _PROTOTYPES */

#  ifdef __cplusplus
     }
#  endif /* __cplusplus */
#  endif /* not _KERNEL */

#endif /* _INCLUDE_XOPEN_SOURCE */


#ifdef _INCLUDE_HPUX_SOURCE

/*
**    Permission Definitions.
**    Implementation Constants.
*/

#  define SHM_R    0400        /* read permission */
#  define SHM_W    0200        /* write permission */

/*
**    ipc_perm Mode Definitions.
**    Only allowed to use bits 033000; others used in ipc.h
*/

#  define SHM_CLEAR    01000    /* clear segment on next attach */
#  define SHM_DEST     02000    /* destroy segment when # attached = 0 */
#  define SHM_NOSWAP  010000    /* region for shared memory is memory locked */
                  /* (or should be when the region is allocated) */

/*
**    Structure Definitions.
*/

/*
** Struct oshmid_ds is the obsolete version of struct shmid_ds.
** Object code compatibility is supported for old a.out files
** that were compiled with this version.  However, old .o files
** should be recompiled with the new struct shmid_ds if they are
** to be linked with the new libc.a.
*/
   struct oshmid_ds {
        struct oipc_perm   shm_perm;    /* operation permission struct */
        unsigned long       shm_segsz;    /* size of segment in bytes */
        struct vas      *shm_vas;       /* virtual address space this entry */
        unsigned short int shm_lpid;    /* pid of last shmop */
        unsigned short int shm_cpid;    /* pid of creator */
        unsigned short int shm_nattch;    /* current # attached (accurate) */
        unsigned short int shm_cnattch;    /* in memory # attached (inaccurate) */
        time_t           shm_atime;    /* last shmat time */
        time_t           shm_dtime;    /* last shmdt time */
        time_t           shm_ctime;    /* last change time */
#ifdef __hp9000s300
        char           shm_pad[60];    /* for object code compability */
#endif /* __hp9000s300 */
#if defined(__hp9000s800) || defined(__ia64)
        char           shm_pad[148];/* for object code compability */
#endif /* __hp9000s800 || __ia64 && ! _KERNEL && ! _LIBC */
   };
#  define _OSHMID_DS_T

   struct    shminfo {
    long    shmmax;      /* max shared memory segment size */
    long    shmmin;      /* min shared memory segment size */
    int    shmmni;   /* # of shared memory identifiers */
    int    shmseg;   /* max attached shared memory segments per process */
   };

#    define SHM_LOCK    3    /* Lock segment in core */
#    define SHM_UNLOCK    4    /* Unlock segment */

#endif /* _INCLUDE_HPUX_SOURCE */

#endif /* _SYS_SHM_INCLUDED */
Re[5]: функция shmat: HP-UNIX 64 bit
От: Andriy Melnyk Украина  
Дата: 21.05.09 08:52
Оценка:
Здравствуйте, Димчанский, Вы писали:

Д>Здравствуйте, Andriy Melnyk, Вы писали:


AM>>Здесь есть проблема еще на этапе компиляции. Очень похоже, что в shmat declaration возвращается 32 битовое значение. Проверте shm.h на возможные 64 bits defines.


Д>Как-то особых дефайнов для 32-х и 64-х бит не нашел.

Д>/usr/include/sys/shm.h:

Д>Reg = (struct MyReg*)shmat(shmid, NULL, 0); // возвращает 0x57ca000


Попробуйте убрать struct, вот так

Reg = (MyReg*)shmat(shmid, NULL, 0);


или просто

Reg = shmat(shmid, NULL, 0);


Возможно там неявное преобразование pointer(8)->int(4)->pointer(8) с потерей значения.
Re[6]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 21.05.09 09:18
Оценка:
Здравствуйте, Andriy Melnyk, Вы писали:

AM>Возможно там неявное преобразование pointer(8)->int(4)->pointer(8) с потерей значения.


Я убрал все кастинги, компилится с предупреждением:
warning: assignment makes pointer from integer without a cast
Падает по той же причине.
Re[7]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 21.05.09 09:28
Оценка:
Д>Я убрал все кастинги, компилится с предупреждением:
Д>warning: assignment makes pointer from integer without a cast
Д>Падает по той же причине.

Попробовал откомпилить с помощью cc компилятора, входящего в состав HP-UNIX, он выдал такое предупреждение:

Warning 942: "test.ec", line 4820 # Types 'SHMReg *' and 'int' are not
assignment-compatible.
Reg = shmat(shmid, NULL, 0);
^^^^^^^^^^^^^^^^^^^^^

Re[8]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 21.05.09 09:51
Оценка:
Здравствуйте, Andriy Melnyk, Вы писали:

AM>Такое впечатление что компилер видит shmat как int shmat (...)


Ну все похоже на то.

AM>А если сделать явную декларацию функции?

AM>
AM>extern void *shmat(int shmid, void *shmaddr, int shmflg);
AM>


Yeah! Помогло.
Но блин, как бы найти где она может перебиваться?
А то может с другими похожими системными функциями подобная беда. Потом былезет где-нибудь боком.
Re[9]: функция shmat: HP-UNIX 64 bit
От: Andriy Melnyk Украина  
Дата: 21.05.09 10:10
Оценка:
Здравствуйте, Димчанский, Вы писали:

Д>Здравствуйте, Andriy Melnyk, Вы писали:


AM>>Такое впечатление что компилер видит shmat как int shmat (...)


Д>Ну все похоже на то.


AM>>А если сделать явную декларацию функции?

AM>>
AM>>extern void *shmat(int shmid, void *shmaddr, int shmflg);
AM>>


Д>Yeah! Помогло.

Д>Но блин, как бы найти где она может перебиваться?
Д>А то может с другими похожими системными функциями подобная беда. Потом былезет где-нибудь боком.

Внимательно изучать ВСЕ варнинги и компилить с -Wall
В даном случае должен быть варнинг что функция shmat undeclared, если компилятор не видел ее (нет хидера, скрыта за дефайном, тп) или перекрыта кем-то — тогда искать поиском и исправлять
Re[10]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 21.05.09 12:19
Оценка:
Здравствуйте, Andriy Melnyk, Вы писали:

AM>Внимательно изучать ВСЕ варнинги и компилить с -Wall

AM>В даном случае должен быть варнинг что функция shmat undeclared, если компилятор не видел ее (нет хидера, скрыта за дефайном, тп) или перекрыта кем-то — тогда искать поиском и исправлять

В рот мне ноги!
Посмотрел на инклюды в этом файле, а такого-то и нет
#include <sys/shm.h>

Врубил все варнинги, а компилятор и пишет "implicit declaration" в месте использования функции, т.е. сам на ходу сочиняет описание для используемой функции.
Словом обычный инклюд решает проблему.
Re[11]: функция shmat: HP-UNIX 64 bit
От: Andriy Melnyk Украина  
Дата: 21.05.09 14:28
Оценка:
Здравствуйте, Димчанский, Вы писали:

Д>Врубил все варнинги, а компилятор и пишет "implicit declaration" в месте использования функции, т.е. сам на ходу сочиняет описание для используемой функции.


Компилятор и делает implicit declaration с типом возвращения int по умолчанию
Re[12]: функция shmat: HP-UNIX 64 bit
От: Димчанский Литва http://dimchansky.github.io/
Дата: 21.05.09 14:37
Оценка:
Здравствуйте, Andriy Melnyk, Вы писали:

AM>Компилятор и делает implicit declaration с типом возвращения int по умолчанию


Так и я о том же
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.