从 gcc 4.2 迁移到 4.8 时代码生成段错误

标签 c gcc

将系统从一台服务器迁移到另一台服务器后,我有一些 C 代码崩溃了。它在 gcc 4.2.1 下编译时有效,但在 4.8 下它崩溃了......这是代码:

void initcap(char *inbuf) {
/* freshen case in string, capitalize first letters */

  char *ptr;

  *ptr=toupper(*inbuf); /* first letter must be cap causing SEG fault */
  for (ptr=inbuf+1; *ptr; ptr++) {
    if ( (isspace(*(ptr-1))) || (ispunct(*(ptr-1))) || (isdigit(*(ptr-1))) )
      *ptr=toupper(*ptr);
    else
      *ptr=tolower(*ptr);
  }
}

导致段错误的行是:*ptr=toupper(*inbuf);

有人可以解释一下我的环境发生了什么变化,可能使它在一个系统上工作正常,而不是在更现代的服务器上工作吗?解决方法是什么?我是否应该在代码的其他区域搜索类似问题?

最佳答案

char *ptr;

*ptr=toupper(*inbuf); /* first letter must be cap causing SEG fault */

突击测试时间:ptr 指向什么?

如果您回答“nuthin”,您就赢了!它没有被初始化,所以它的初始内容是随机的垃圾。祝贺您在进程地址空间中加扰了一个随机指向的字节。你赢了一次完全随机的段错误和一次崩溃。

关于从 gcc 4.2 迁移到 4.8 时代码生成段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36877555/

相关文章:

c - socket() 中的类型和协议(protocol)有什么区别?

c++ - C/C++ : adding 0

c - C中的整数SIMD指令AVX

c - GCC不同的实际内存分配量,然后我分配给程序中的变量

c++ - 如何在 C 和 C++ 中实现装饰器

c - 当我在没有免费的情况下用新指针分配指针时,这是不好的做法吗?

c - 尝试打印堆栈的元素时堆栈实现崩溃

c++ - 在具有较旧 gcc/glibc/libstdc++ 的计算机上运行使用 gcc 4.7 编译的 C++11 可执行文件的问题

c++ - 在C/C++编程中,从较小的地址减去较大的地址时,输出指示什么?

c++ - 程序中不明确的指针缺陷