首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xilinx编译器不会抱怨无效指针算法,它会产生正确的结果。为什么?

Xilinx编译器不会抱怨无效指针算法,它会产生正确的结果。为什么?
EN

Stack Overflow用户
提问于 2015-07-08 17:22:16
回答 2查看 157关注 0票数 2

在过去的一年中,我使用Xilinx中的地址空间使用它们的编译器读取了以下代码,并且在编译过程中没有出现错误,并产生了预期的结果:

代码语言:javascript
复制
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,这是包含以下内容的文件的编译结果:

代码语言:javascript
复制
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)

这是版本输出:

代码语言:javascript
复制
[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) 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-08 17:24:49

gcc有一个允许空指针算法的扩展,请参阅文档:空指针和函数指针的算法

在GNU C中,函数的指针和函数的指针都支持加法和减法操作。这是通过将一个空值或函数的大小处理为1来完成的。 这样做的一个结果是,在void和函数类型上也允许使用sizeof of,并返回1。 如果使用这些扩展,则选项-W指针-arith将请求一个警告。

票数 1
EN

Stack Overflow用户

发布于 2015-07-08 17:27:34

最初的C编译器(Unix 6,c.1975)也是这样工作的。它忽略了void,并将指针作为一个数字对待。或者--另一种看待它的方法--是它将void *视为与char *相同。

原来的c编译器也正确地做了更高级的指针对象填充。它必须使索引struct {int a, b;} mystruct [20]如预期的那样工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31299482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档