走进 Segmentation Violations/Faults

段异常是 c/c++ 中常见的一类 run-time 错误。它的出现意味着你的程序试图访问并没有权限访问的地址(通常都是写错误)。

本篇博文可以给解决该 bug 提供一些思路

常见的诱因:

  • printf/scanf 中的格式符字符串不规范:字符串格式符的数量一定要跟输入的实参数目匹配,否则轻则报段异常,重则被 hacker 利用,造成重大损失!(网络安全中这类问题统称为格式化字符串攻击)
  • scanf 中的参数忘了加 “&”:scanf 以格式化字符串和变量的地址作为输入。取址符号 “&” 用来提供变量的地址。忽略 scanf 中任一参数的 “&” 符号都会导致 segmentation violation
  • 访问数组越界:包括上越界和下越界
  • 指针在访问前没有初始化:指针变量在访问前必须要初始化一个有效的地址
  • 取址符 “&” 和解引用 “*” 符的错误使用

针对上文几点做以下归纳:

恰当的指针初始化:

为指针变量赋予一个已定义变量的地址是最常见的形式:

int * ptr;
int variable;
ptr = &variable;
or:
int variable;
int *ptr = &variable;

其他常见方法包括为指针赋予调用 matrix,vector,calloc 或 malloc 或其他等效函数分配的内存地址。

尽量少用指针变量:很多时候,函数需要接收地址参数(否则会进行复制拷贝操作,导致大量的时间及空间开销)。scanf 函数是一个极好的例子。

Share this to:

发表评论

电子邮件地址不会被公开。 必填项已用*标注