1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include <stdio.h> 29*cdf0e10cSrcweir #include <stdlib.h> 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir typedef enum { t_char, t_short, t_int, t_long, t_double } Type; 32*cdf0e10cSrcweir typedef int (*TestFunc)( Type, void* ); 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir struct Description; 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir int IsBigEndian(void); 37*cdf0e10cSrcweir int IsStackGrowingDown_2( int * pI ); 38*cdf0e10cSrcweir int IsStackGrowingDown(void); 39*cdf0e10cSrcweir int GetStackAlignment_3( char*p, long l, int i, short s, char b, char c, ... ); 40*cdf0e10cSrcweir int GetStackAlignment_2( char*p, long l, int i, short s, char b, char c ); 41*cdf0e10cSrcweir int GetStackAlignment(void); 42*cdf0e10cSrcweir void PrintArgs( int p, ... ); 43*cdf0e10cSrcweir int check( TestFunc func, Type eT, void* p ); 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir #if defined (UNX) || defined (WNT) || defined (OS2) 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir #ifdef UNX 48*cdf0e10cSrcweir #include <unistd.h> 49*cdf0e10cSrcweir #endif 50*cdf0e10cSrcweir #include <sys/types.h> 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir #define I_STDARG 53*cdf0e10cSrcweir #ifdef I_STDARG 54*cdf0e10cSrcweir #include <stdarg.h> 55*cdf0e10cSrcweir #else 56*cdf0e10cSrcweir #include <varargs.h> 57*cdf0e10cSrcweir #endif 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir #define NO_USE_FORK_TO_CHECK 60*cdf0e10cSrcweir #ifdef USE_FORK_TO_CHECK 61*cdf0e10cSrcweir #include <sys/wait.h> 62*cdf0e10cSrcweir #else 63*cdf0e10cSrcweir #include <signal.h> 64*cdf0e10cSrcweir #include <setjmp.h> 65*cdf0e10cSrcweir #endif 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir #else 68*cdf0e10cSrcweir #endif 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir #define printTypeSize(Type,Name) printf( "sizeof(%s)\t= %d\n", Name, \ 71*cdf0e10cSrcweir sizeof (Type) ) 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir #define isSignedType(Type) (((Type)-1) < 0) 74*cdf0e10cSrcweir #define printTypeSign(Type,Name) printf( "%s\t= %s %s\n", Name, \ 75*cdf0e10cSrcweir ( isSignedType(Type) ? "unsigned" : "signed" ), Name ) 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir int IsBigEndian() 79*cdf0e10cSrcweir { 80*cdf0e10cSrcweir long l = 1; 81*cdf0e10cSrcweir return ! *(char*)&l; 82*cdf0e10cSrcweir } 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir int IsStackGrowingDown_2( int * pI ) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir int i = 1; 87*cdf0e10cSrcweir return ((unsigned long)&i) < (unsigned long)pI; 88*cdf0e10cSrcweir } 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir int IsStackGrowingDown() 91*cdf0e10cSrcweir { 92*cdf0e10cSrcweir int i = 1; 93*cdf0e10cSrcweir return IsStackGrowingDown_2(&i); 94*cdf0e10cSrcweir } 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir int GetStackAlignment_3( char*p, long l, int i, short s, char b, char c, ... ) 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir (void) p; (void) l; (void) i; (void) s; /* unused */ 99*cdf0e10cSrcweir if ( IsStackGrowingDown() ) 100*cdf0e10cSrcweir return &c - &b; 101*cdf0e10cSrcweir else 102*cdf0e10cSrcweir return &b - &c; 103*cdf0e10cSrcweir } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir int GetStackAlignment_2( char*p, long l, int i, short s, char b, char c ) 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir (void) p; (void) l; (void) i; (void) s; /* unused */ 108*cdf0e10cSrcweir if ( IsStackGrowingDown() ) 109*cdf0e10cSrcweir return &c - &b; 110*cdf0e10cSrcweir else 111*cdf0e10cSrcweir return &b - &c; 112*cdf0e10cSrcweir } 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir int GetStackAlignment() 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir int nStackAlignment = GetStackAlignment_3(0,1,2,3,4,5); 117*cdf0e10cSrcweir if ( nStackAlignment != GetStackAlignment_2(0,1,2,3,4,5) ) 118*cdf0e10cSrcweir printf( "Pascal calling convention\n" ); 119*cdf0e10cSrcweir return nStackAlignment; 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir #if defined (UNX) || defined (WNT) || defined (OS2) 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir #ifdef I_STDARG 128*cdf0e10cSrcweir void PrintArgs( int p, ... ) 129*cdf0e10cSrcweir #else 130*cdf0e10cSrcweir void PrintArgs( p, va_alist ) 131*cdf0e10cSrcweir int p; 132*cdf0e10cSrcweir va_dcl 133*cdf0e10cSrcweir #endif 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir int value; 136*cdf0e10cSrcweir va_list ap; 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir #ifdef I_STDARG 139*cdf0e10cSrcweir va_start( ap, p ); 140*cdf0e10cSrcweir #else 141*cdf0e10cSrcweir va_start( ap ); 142*cdf0e10cSrcweir #endif 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir printf( "value = %d", p ); 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir while ( ( value = va_arg(ap, int) ) != 0 ) 147*cdf0e10cSrcweir printf( " %d", value ); 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir printf( "\n" ); 150*cdf0e10cSrcweir va_end(ap); 151*cdf0e10cSrcweir } 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir #ifndef USE_FORK_TO_CHECK 154*cdf0e10cSrcweir static jmp_buf check_env; 155*cdf0e10cSrcweir static int bSignal; 156*cdf0e10cSrcweir #if defined (UNX) || defined (OS2) 157*cdf0e10cSrcweir void SignalHandler( int sig ) 158*cdf0e10cSrcweir #else 159*cdf0e10cSrcweir void __cdecl SignalHandler( int sig ) 160*cdf0e10cSrcweir #endif 161*cdf0e10cSrcweir { 162*cdf0e10cSrcweir bSignal = 1; 163*cdf0e10cSrcweir /* 164*cdf0e10cSrcweir fprintf( stderr, "Signal %d caught\n", sig ); 165*cdf0e10cSrcweir signal( sig, SignalHandler ); 166*cdf0e10cSrcweir */ 167*cdf0e10cSrcweir longjmp( check_env, sig ); 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir #endif 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir int check( TestFunc func, Type eT, void* p ) 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir #ifdef USE_FORK_TO_CHECK 174*cdf0e10cSrcweir pid_t nChild = fork(); 175*cdf0e10cSrcweir if ( nChild ) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir int exitVal; 178*cdf0e10cSrcweir wait( &exitVal ); 179*cdf0e10cSrcweir if ( exitVal & 0xff ) 180*cdf0e10cSrcweir return -1; 181*cdf0e10cSrcweir else 182*cdf0e10cSrcweir return exitVal >> 8; 183*cdf0e10cSrcweir } 184*cdf0e10cSrcweir else 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir exit( func( eT, p ) ); 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir #else 189*cdf0e10cSrcweir int result; 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir bSignal = 0; 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir if ( !setjmp( check_env ) ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir signal( SIGSEGV, SignalHandler ); 196*cdf0e10cSrcweir #ifdef UNX 197*cdf0e10cSrcweir signal( SIGBUS, SignalHandler ); 198*cdf0e10cSrcweir #else 199*cdf0e10cSrcweir #endif 200*cdf0e10cSrcweir result = func( eT, p ); 201*cdf0e10cSrcweir signal( SIGSEGV, SIG_DFL ); 202*cdf0e10cSrcweir #ifdef UNX 203*cdf0e10cSrcweir signal( SIGBUS, SIG_DFL ); 204*cdf0e10cSrcweir #else 205*cdf0e10cSrcweir #endif 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir if ( bSignal ) 209*cdf0e10cSrcweir return -1; 210*cdf0e10cSrcweir else 211*cdf0e10cSrcweir return 0; 212*cdf0e10cSrcweir #endif 213*cdf0e10cSrcweir } 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir #endif 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir int GetAtAddress( Type eT, void* p ) 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir switch ( eT ) 221*cdf0e10cSrcweir { 222*cdf0e10cSrcweir case t_char: return *((char*)p); 223*cdf0e10cSrcweir case t_short: return *((short*)p); 224*cdf0e10cSrcweir case t_int: return *((int*)p); 225*cdf0e10cSrcweir case t_long: return *((long*)p); 226*cdf0e10cSrcweir case t_double: return *((double*)p); 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir abort(); 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir int SetAtAddress( Type eT, void* p ) 232*cdf0e10cSrcweir { 233*cdf0e10cSrcweir switch ( eT ) 234*cdf0e10cSrcweir { 235*cdf0e10cSrcweir case t_char: return *((char*)p) = 0; 236*cdf0e10cSrcweir case t_short: return *((short*)p) = 0; 237*cdf0e10cSrcweir case t_int: return *((int*)p) = 0; 238*cdf0e10cSrcweir case t_long: return *((long*)p) = 0; 239*cdf0e10cSrcweir case t_double: return *((double*)p)= 0; 240*cdf0e10cSrcweir } 241*cdf0e10cSrcweir abort(); 242*cdf0e10cSrcweir } 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir char* TypeName( Type eT ) 245*cdf0e10cSrcweir { 246*cdf0e10cSrcweir switch ( eT ) 247*cdf0e10cSrcweir { 248*cdf0e10cSrcweir case t_char: return "char"; 249*cdf0e10cSrcweir case t_short: return "short"; 250*cdf0e10cSrcweir case t_int: return "int"; 251*cdf0e10cSrcweir case t_long: return "long"; 252*cdf0e10cSrcweir case t_double: return "double"; 253*cdf0e10cSrcweir } 254*cdf0e10cSrcweir abort(); 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir int CheckGetAccess( Type eT, void* p ) 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir int b; 260*cdf0e10cSrcweir b = -1 != check( (TestFunc)GetAtAddress, eT, p ); 261*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 262*cdf0e10cSrcweir fprintf( stderr, 263*cdf0e10cSrcweir "%s read %s at %p\n", 264*cdf0e10cSrcweir (b? "can" : "can not" ), TypeName(eT), p ); 265*cdf0e10cSrcweir #endif 266*cdf0e10cSrcweir return b; 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir int CheckSetAccess( Type eT, void* p ) 269*cdf0e10cSrcweir { 270*cdf0e10cSrcweir int b; 271*cdf0e10cSrcweir b = -1 != check( (TestFunc)SetAtAddress, eT, p ); 272*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 273*cdf0e10cSrcweir fprintf( stderr, 274*cdf0e10cSrcweir "%s write %s at %p\n", 275*cdf0e10cSrcweir (b? "can" : "can not" ), TypeName(eT), p ); 276*cdf0e10cSrcweir #endif 277*cdf0e10cSrcweir return b; 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir 280*cdf0e10cSrcweir int GetAlignment( Type eT ) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir char a[ 16*8 ]; 283*cdf0e10cSrcweir int p = (int)(void*)&a; 284*cdf0e10cSrcweir int i; 285*cdf0e10cSrcweir p = ( p + 0xF ) & ~0xF; 286*cdf0e10cSrcweir for ( i = 1; i < 16; i++ ) 287*cdf0e10cSrcweir if ( CheckGetAccess( eT, (void*)(p+i) ) ) 288*cdf0e10cSrcweir return i; 289*cdf0e10cSrcweir return 0; 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir int CheckCharAccess( char* p ) 293*cdf0e10cSrcweir { 294*cdf0e10cSrcweir if ( CheckGetAccess( t_char, p ) ) 295*cdf0e10cSrcweir printf( "can read address %p\n", p ); 296*cdf0e10cSrcweir else 297*cdf0e10cSrcweir printf( "can not read address %p\n", p ); 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir if ( CheckSetAccess( t_char, p ) ) 300*cdf0e10cSrcweir printf( "can write address %p\n", p ); 301*cdf0e10cSrcweir else 302*cdf0e10cSrcweir printf( "can not write address %p\n", p ); 303*cdf0e10cSrcweir 304*cdf0e10cSrcweir return 0; 305*cdf0e10cSrcweir } 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir struct Description 308*cdf0e10cSrcweir { 309*cdf0e10cSrcweir int bBigEndian; 310*cdf0e10cSrcweir int bStackGrowsDown; 311*cdf0e10cSrcweir int nStackAlignment; 312*cdf0e10cSrcweir int nAlignment[3]; /* 2,4,8 */ 313*cdf0e10cSrcweir }; 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir void Description_Ctor( struct Description* pThis ) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir pThis->bBigEndian = IsBigEndian(); 318*cdf0e10cSrcweir pThis->bStackGrowsDown = IsStackGrowingDown(); 319*cdf0e10cSrcweir pThis->nStackAlignment = GetStackAlignment(); 320*cdf0e10cSrcweir 321*cdf0e10cSrcweir if ( sizeof(short) != 2 ) 322*cdf0e10cSrcweir abort(); 323*cdf0e10cSrcweir pThis->nAlignment[0] = GetAlignment( t_short ); 324*cdf0e10cSrcweir if ( sizeof(int) != 4 ) 325*cdf0e10cSrcweir abort(); 326*cdf0e10cSrcweir pThis->nAlignment[1] = GetAlignment( t_int ); 327*cdf0e10cSrcweir if ( sizeof(double) != 8 ) 328*cdf0e10cSrcweir abort(); 329*cdf0e10cSrcweir pThis->nAlignment[2] = GetAlignment( t_double ); 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir void Description_Print( struct Description* pThis, char* name ) 333*cdf0e10cSrcweir { 334*cdf0e10cSrcweir int i; 335*cdf0e10cSrcweir FILE* f = fopen( name, "w" ); 336*cdf0e10cSrcweir fprintf( f, "#define __%s\n", 337*cdf0e10cSrcweir pThis->bBigEndian ? "BIGENDIAN" : "LITTLEENDIAN" ); 338*cdf0e10cSrcweir for ( i = 0; i < 3; i++ ) 339*cdf0e10cSrcweir fprintf( f, "#define __ALIGNMENT%d\t%d\n", 340*cdf0e10cSrcweir 1 << (i+1), pThis->nAlignment[i] ); 341*cdf0e10cSrcweir fprintf( f, "#define __STACKALIGNMENT wird nicht benutzt\t%d\n", pThis->nStackAlignment ); 342*cdf0e10cSrcweir fprintf( f, "#define __STACKDIRECTION\t%d\n", 343*cdf0e10cSrcweir pThis->bStackGrowsDown ? -1 : 1 ); 344*cdf0e10cSrcweir fprintf( f, "#define __SIZEOFCHAR\t%d\n", sizeof( char ) ); 345*cdf0e10cSrcweir fprintf( f, "#define __SIZEOFSHORT\t%d\n", sizeof( short ) ); 346*cdf0e10cSrcweir fprintf( f, "#define __SIZEOFINT\t%d\n", sizeof( int ) ); 347*cdf0e10cSrcweir fprintf( f, "#define __SIZEOFLONG\t%d\n", sizeof( long ) ); 348*cdf0e10cSrcweir fprintf( f, "#define __SIZEOFPOINTER\t%d\n", sizeof( void* ) ); 349*cdf0e10cSrcweir fprintf( f, "#define __SIZEOFDOUBLE\t%d\n", sizeof( double ) ); 350*cdf0e10cSrcweir fprintf( f, "#define __IEEEDOUBLE\n" ); 351*cdf0e10cSrcweir fprintf( f, "#define _SOLAR_NODESCRIPTION\n" ); 352*cdf0e10cSrcweir 353*cdf0e10cSrcweir fclose(f); 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir int 357*cdf0e10cSrcweir #ifdef WNT 358*cdf0e10cSrcweir __cdecl 359*cdf0e10cSrcweir #endif 360*cdf0e10cSrcweir main( int argc, char* argv[] ) 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir printTypeSign( char, "char" ); 363*cdf0e10cSrcweir printTypeSign( short, "short" ); 364*cdf0e10cSrcweir printTypeSign( int, "int" ); 365*cdf0e10cSrcweir printTypeSign( long, "long" ); 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir printTypeSize( char, "char" ); 368*cdf0e10cSrcweir printTypeSize( short, "short" ); 369*cdf0e10cSrcweir printTypeSize( int, "int" ); 370*cdf0e10cSrcweir printTypeSize( long, "long" ); 371*cdf0e10cSrcweir printTypeSize( float, "float" ); 372*cdf0e10cSrcweir printTypeSize( double, "double" ); 373*cdf0e10cSrcweir printTypeSize( void *, "void *" ); 374*cdf0e10cSrcweir 375*cdf0e10cSrcweir if ( IsBigEndian() ) 376*cdf0e10cSrcweir printf( "BIGENDIAN (Sparc, MC680x0, RS6000)\n" ); 377*cdf0e10cSrcweir else 378*cdf0e10cSrcweir printf( "LITTLEENDIAN (Intel, VAX, PowerPC)\n" ); 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir if( IsStackGrowingDown() ) 381*cdf0e10cSrcweir printf( "Stack waechst nach unten\n" ); 382*cdf0e10cSrcweir else 383*cdf0e10cSrcweir printf( "Stack waechst nach oben\n" ); 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir printf( "STACKALIGNMENT : %d\n", GetStackAlignment() ); 386*cdf0e10cSrcweir 387*cdf0e10cSrcweir PrintArgs( 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ); 388*cdf0e10cSrcweir 389*cdf0e10cSrcweir { 390*cdf0e10cSrcweir char a[64]; 391*cdf0e10cSrcweir int i = 56; 392*cdf0e10cSrcweir do 393*cdf0e10cSrcweir { 394*cdf0e10cSrcweir printf( "Zugriff long auf %i-Aligned Adresse : ", i / 7 ); 395*cdf0e10cSrcweir printf( ( CheckGetAccess( t_long, (long*)&a[i] ) ? "OK\n" : "ERROR\n" ) ); 396*cdf0e10cSrcweir i >>= 1; 397*cdf0e10cSrcweir } while( i >= 7 ); 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir { 401*cdf0e10cSrcweir char a[64]; 402*cdf0e10cSrcweir int i = 56; 403*cdf0e10cSrcweir do 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir printf( "Zugriff double auf %i-Aligned Adresse : ", i / 7 ); 406*cdf0e10cSrcweir printf( ( CheckGetAccess( t_double, (double*)&a[i] ) ? "OK\n" : "ERROR\n" ) ); 407*cdf0e10cSrcweir i >>= 1; 408*cdf0e10cSrcweir } while( i >= 7 ); 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir { 412*cdf0e10cSrcweir char* p = NULL; 413*cdf0e10cSrcweir CheckCharAccess( p ); 414*cdf0e10cSrcweir p = (char*)&p; 415*cdf0e10cSrcweir CheckCharAccess( p ); 416*cdf0e10cSrcweir } 417*cdf0e10cSrcweir 418*cdf0e10cSrcweir if ( argc > 1 ) 419*cdf0e10cSrcweir { 420*cdf0e10cSrcweir struct Description description; 421*cdf0e10cSrcweir Description_Ctor( &description ); 422*cdf0e10cSrcweir Description_Print( &description, argv[1] ); 423*cdf0e10cSrcweir } 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir exit( 0 ); 426*cdf0e10cSrcweir return 0; 427*cdf0e10cSrcweir } 428