在过去的一年中,我使用Xilinx中的地址空间使用它们的编译器读取了以下代码,并且在编译过程中没有出现错误,并产生了预期的结果:
void *ctl_ptr = mmap(NULL,Length , PROT_READ|PROT_WRITE, MAP_SHARED, fd, ctl_addr);
// Read Status
int status = *((unsigned *)(ctl_ptr + C_FIFO_ISR));
// Clear Interrupts
*((unsigned *)(ctl_ptr + C_FIFO_ISR)) = 0xffffff;一位同事今天提到,这段代码甚至不应该工作,因为它是无效指针算法。现在我很困惑它为什么一直在工作?
这是一个空指针算术的例子(看起来是这样的),如果是的话,为什么要工作呢?
更多信息:
我一直在使用Xilinx 2014.1,这是包含以下内容的文件的编译结果:
19:09:55 **** Auto Build of configuration Debug for project ZynqPSPLTest ****
make all
Building file: ../src/ZynqPSPLTest.c
Invoking: ARM Linux gcc compiler
arm-xilinx-linux-gnueabi-gcc -Wall -O0 -g3 -c -fmessage-length=0 -MMD -MP -MF"src/ZynqPSPLTest.d" -MT"src/ZynqPSPLTest.d" -o "src/ZynqPSPLTest.o" "../src/ZynqPSPLTest.c"
Finished building: ../src/ZynqPSPLTest.c
Building target: ZynqPSPLTest.elf
Invoking: ARM Linux gcc linker
arm-xilinx-linux-gnueabi-gcc -o "ZynqPSPLTest.elf" ./src/ZynqPSPLTest.o
Finished building target: ZynqPSPLTest.elf
make --no-print-directory post-build
Copy Elf to share
cp /media/work/stacey/zynq_eval/EvalDebug/sdk/ZynqPSPLTest/Debug/ZynqPSPLTest.elf /home/stacey/build_share
Invoking: ARM Linux Print Size
arm-xilinx-linux-gnueabi-size ZynqPSPLTest.elf |tee "ZynqPSPLTest.elf.size"
text data bss dec hex filename
11339 328 4 11671 2d97 ZynqPSPLTest.elf
Finished building: ZynqPSPLTest.elf.size
19:09:56 Build Finished (took 720ms)这是版本输出:
[stacey@centos6 bin]$ ./arm-xilinx-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=./arm-xilinx-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/media/work/Xilinx/SDK/2014.1/gnu/arm/lin/bin/../libexec/gcc/arm-xilinx-linux-gnueabi/4.8.1/lto-wrapper
Target: arm-xilinx-linux-gnueabi
Configured with: /scratch/janisjo/build7/2013.11-xilinx-linux-respin1/src/gcc-4.8-2013.11/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-xilinx-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-arch=armv5te --with-arch=armv7-a --with-cpu=cortex-a9 --with-float=softfp --with-fpu=neon-fp16 --disable-multilib --with-gnu-as --with-gnu-ld --with-specs='%{save-temps: -fverbose-asm} %{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables} -D__CS_SOURCERYGXX_MAJ__=2013 -D__CS_SOURCERYGXX_MIN__=11 -D__CS_SOURCERYGXX_REV__=53' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery CodeBench Lite 2013.11-53' --with-bugurl=https://sourcery.mentor.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-xilinx-linux-gnueabi/libc --with-build-sysroot=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/install/opt/codesourcery/arm-xilinx-linux-gnueabi/libc --with-gmp=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpfr=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-mpc=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-isl=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --with-cloog=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/obj/pkg-2013.11-53-arm-xilinx-linux-gnueabi/xilinx-2013.11-53-arm-xilinx-linux-gnueabi.extras/host-libs-i686-pc-linux-gnu/usr --disable-libgomp --disable-libitm --disable-libssp --enable-poison-system-directories --with-build-time-tools=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/install/opt/codesourcery/arm-xilinx-linux-gnueabi/bin --with-build-time-tools=/scratch/janisjo/build7/2013.11-xilinx-linux-respin1/install/opt/codesourcery/arm-xilinx-linux-gnueabi/bin SED=sed
Thread model: posix
gcc version 4.8.1 (Sourcery CodeBench Lite 2013.11-53) 发布于 2015-07-08 17:24:49
gcc有一个允许空指针算法的扩展,请参阅文档:空指针和函数指针的算法
在GNU C中,函数的指针和函数的指针都支持加法和减法操作。这是通过将一个空值或函数的大小处理为1来完成的。 这样做的一个结果是,在void和函数类型上也允许使用sizeof of,并返回1。 如果使用这些扩展,则选项-W指针-arith将请求一个警告。
发布于 2015-07-08 17:27:34
最初的C编译器(Unix 6,c.1975)也是这样工作的。它忽略了void,并将指针作为一个数字对待。或者--另一种看待它的方法--是它将void *视为与char *相同。
原来的c编译器也正确地做了更高级的指针对象填充。它必须使索引struct {int a, b;} mystruct [20]如预期的那样工作。
https://stackoverflow.com/questions/31299482
复制相似问题