C语言基础-程序常见错误(一)

序言

记录Debug过程中的一些error、warning和info及其解决方法


  • 程序error:头文件提示其他头文件中定义的数据结构没有定义
    • 如果在该文件中再定义会导致重定义报错
    • 如果在头文件中添加包含该数据结构的头文件同样会导致重定义报错
    • 解决办法:在该头文件中添加该数据结构的类型说明,比如:struct packetqueue PktQue;就可以在当前头文件中使用该结构体了

  • 程序error:头文件中提示变量类型未定义
    • 比如u_int未定义等,非系统自带类型。typedef unsigned int u_int;

  • 程序error:expected ‘char *’ but argument is of type ‘char ’ **
    • 报错原因在于函数使用过程中实参(argument)和形参(parameter)类型不一样造成,形参只需要指针而实参则提供了指针的指针。
    • 修改方法:修改使用过该函数的实参类型,比如char *变成char等

  • 程序error:conflicting types for ‘Function()’
    • 报错原因:函数重复声明,可能在头文件中声明一次,又在源文件中声明了一次
    • 一般保留头文件中的函数声明

  • 程序warning:implicit declaration of function ‘bzero’
    • 提示原因:没有包含函数头文件
    • 添加函数头文件,bzero函数头文件为 string.h

  • 程序warning:pointer targets in passing argument 1 of ‘strlen’ differ in signedness
    • 原因:参数传递时”signed/unsigned”不一致
    • 解决方法:强制类型转换;另一种思路是告诉编译器忽略这种警告

  • 程序error:Signal: SIGABRT (Aborted)
    • 报错原因:发生了内存溢出或内存错误使用
    • 解决方法:检查堆栈分配和释放情况,可能是堆提前释放或者忘记重新分配/初始化导致内存溢出或使用错误。可用watch锁定变量,如果这个变量被错误修改,我们就可以看到底是哪条语句修改了这个程序。
    • 注:比如malloc分配的堆空间如果提前释放,再次使用时又忘记分配就会出现内存使用错误

  • 程序error:signal SIGSEGV, Segmentation fault
    • 错误原因:段错误。指针声明时,指向的位置不确定,程序运行时,动态分配内存的时候指针指向异常位置
    • 实际例子:sendto发送队列中已有数据,读取数据超过已有数据,报分段错误
      • 段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如:
        • 访问了不存在的内存地址(已被提前free掉等)
        • 访问了系统保护的内存地址
        • 访问了只读的内存地址
        • 堆栈溢出等
    • 解决方法:检查内存分配和使用是否有误,参考文章http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html

  • 程序error:段错误 (核心已转储)
    • 同上。Valgrind中提示如下
    • ==28436== Process terminating with default action of signal 11 (SIGSEGV)
      ==28436== Access not within mapped region at address 0x8
    • 原因:可能是没有为变量分配空间造成的,或者由于内存需求超过所分配的内存,也可能是赋值错误造成的比如给地址赋值等(char *dest; dest = ‘\0’)
    • 解决方法:重新分配内存,检查内存实际占用

  • 程序warning:unknown conversion type character 0xa in format
    • printf(“compression ratio is %.4f%\n”,comp_ratio*100);
    • 原因:未正确输出百分号
    • 百分号的输出格式为%%

  • 程序error:Clion中,对‘ReadPreambleFromFile’未定义的引用
    • ReadPreambleFromFile()为其他源文件中的函数
      • 原因:Cmakelists.txt文件中没有将对应的源文件和头文件包含进来
      • 解决方法:添加函数所在的源文件和头文件

  • Valgrind error:malloc分配的两个地址赋值时overlap
    • Source and destination overlap in memcpy
    • 原因:因为malloc分配的两个地址空间不可能重叠,所以原因可能是内存越界导致,或者是因为存储数据的地址空间不存在(目的地址所指空间被提前free掉等)
    • 解决方法:检查互相赋值的两个地址,是否存在地址越界操作的情况,比如取值长度超过已分配内存长度等

  • Valgrind warning:sendto指向未初始化字节
    • Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
    • 原因:sendto()中send buffer有未初始化字节
    • 解决方法:检查该buffer是否按规定长度分配空间并初始化;如果初始化正确,那可能是valgrind在该情况下的误报

  • 程序error:excess elements in array initializer
    • 原因:初始化时超过数组定义的元素个数
    • 解决方法:重新定义;数组初始化时可不加元素个数直接初始化,如a[] = {1, 2, 3, 4}



Acknowledgements:
http://blog.csdn.net/htjoy1202/article/details/40919301
https://stackoverflow.com/questions/19364942/points-to-uninitialised-bytes-valgrind-errors

2017.06.25

你可能感兴趣的:(C/C++)