对前一篇文章的检讨

不好意思,污染大家的眼睛了。
我比较落后,没察觉到gcc的一些变化,我去各方了解了一下资料:
在 ./gcc/ChangeLog-2000 引入新的关键字 __bounded 和 __unbounded, 作为指针的修饰符,
在 ./gcc/ChangeLog-2003 中又被 removed 掉了。
不知道这 2000-2003 年之间是对应哪些版本的 gcc ?
在这些版本的 gcc 中可以使用 __bounded 和 __unbouned 强制修饰,也可以在命令行参数 -fbounded-pointers 指定未声明类型的指针为 __bounded 指针,缺省行为是 __unbounded 指针。

详见:
1999年的一个patch增加 __bounded 和 __unbounded 关键字:
http://gcc.gnu.org/ml/gcc-patches/1999-09n/msg00801.html
2003年的另一个patch将它删除了:
http://gcc.gnu.org/ml/gcc-patches/2003-05/msg01737.html

在 gcc4.1.1 的 info 中还可以找到:
`-fbounds-check'
    For front-ends that support it, generate additional code to check
    that indices used to access arrays are within the declared range.
    This is currently only supported by the Java and Fortran
    front-ends, where this option defaults to true and false
    respectively.
这个 f 特性打开边界检查,但只在 Java 和 Fortran 中有支持。
总结:
1、不需要__bounded / __unbounded了。关于c库中gnu libc 2.4中多次涉及这两个关键字不知道怎么原因?
2、既然有程序员来保证不越界,那么对src和dest指针是否为null也无必要了,反正最后的结果都是abort.
3、有时候,公司要你写得并非c库,所以你还是要懂得缓冲区溢出问题。
以下这个我确保能编译过,而已应该比while ( (*dest++ = *src++) != '0' )效率高:
#include <stddef.h> /* 在iso c中的标准头文件 */
char *
strcpy(char *dest, const char *src)
 {
     register char c;
     char *s = src;
     const ptrdiff_t off = dest- s - 1;
     do {
          c = *s++;
          s[off] = c;
     } while (c != '/0');
     return dest;
}

我本想学一下标准c库的,想不到惹来这么多麻烦,汗!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值