热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

返回语句不会在c中执行

如何解决《返回语句不会在c中执行》经验,为你挑选了1个好方法。



1> Peter Cordes..:

void * myObject;是未初始化的,并没有指向有效的存储空间. 读取它的值(将值作为arg传递给Somestruct_ctor(myObject))是未定义的行为.

您的代码并不总是崩溃这一事实告诉我们,在ICC的代码中,它恰好指向某个有效的位置,可能位于堆栈的某个位置.对于更大的文件,我们可能会得到一个缓冲区溢出,它会覆盖局部变量和/或返回地址,最终会进入无限循环. 令人惊讶的是,由于它是偶然发生的,所以仍然没有崩溃. (在禁用优化的ICC的x86-64 asm中,它只是将一些未初始化的堆栈内存加载为arg for Somestruct_ctor.)

或者它可能是指向stdio数据结构的指针,之前是从stdio的init遗留下来的main.也许已经fillDataFromFile遍布FILE *stdout指向(例如)使其处于"锁定"状态的数据,因此您的单线程卡在等待其他东西解锁互斥锁. 如果你知道asm,那么在内部单步执行无限循环或"死锁" printf并查看究竟发生了什么可能会很有趣.


如果你编译gcc -O3,编译器将一个寄存器作为一个arg用于fillDataFromFile(在内联之后Somestruct_ctor),所以它传递一个NULL指针.假设函数取消引用指针,那么可能会崩溃.

clang选择离开rdi(x86-64 System V中调用conventino的第一个arg-passing寄存器)未初始化,因此argcmain调用时仍然保持不变fillDataFromFile.这也可能会崩溃.


您忘记启用编译器警告.

所有主要的x86编译器(gcc,clang,MSVC,ICC)都有此警告,但默认情况下它们并不在所有编译器中(仅在MSVC中).可能是因为如果存在某些条件性内容,可能存在编译器不确定var未初始化的情况.在这种情况下,100%肯定它肯定是未初始化的,但如果init和use在不同的if()块中,编译器可能无法证明只在init发生时才使用.

使用clang和gcc,您通常应该使用-Wall并静音所有警告.

与ICC,-diag-enable:warn更接近gcc -Wall.(ICC -Wall没有启用这个非常重要的警告.不要误以为你已经启用了所有重要的警告icc -Wall.)

 # from icc -diag-enable:warn on your code
(21): warning #592: variable "myObject" is used before its value is set
    myObject = Somestruct_ctor(myObject);
                               ^

如何启用icc/icpc警告?有一些信息.-Wall与gcc相比,icc的方式非常简约.所以也许-Wall -Wextra对icc有用.它建议-w2-w3作为潜在有用的警告级别.


Clang通常有最好的警告,在这种情况下:

:21:30: warning: variable 'myObject' is uninitialized when used here [-Wuninitialized]
  myObject = Somestruct_ctor(myObject);
                             ^~~~~~~~
:19:18: note: initialize the variable 'myObject' to silence this warning
  void * myObject;
                 ^
                  = NULL
1 warning generated.

我通过在Godbolt编译器资源管理器上编译你的源代码来获得上述输出(在修复语法错误之后:在结构之后缺少分号,以及Struct关键字的大小写.) -xc告诉Godbolt上的C++编译器编译为C.

事实证明,您不需要为icc和gcc启用优化来注意此错误.某些警告仅适用于启用优化的情况,其中编译器会对程序逻辑进行更多分析并且可以注意到更多,但它们甚至可以跟踪未初始化-O0.


更有意义的构造函数代码:

// C
int main(void){
  struct Somestruct myObject;     // automatic storage for the object value
  Somestruct_ctor(&myObject);     // pass a pointer to that storage
}

对象需要住在某个地方.我们可以通过自动(本地),静态(static本地或全局)或动态存储(malloc)获得空间.

如果struct Somestruct在struct/class定义中声明了C++默认构造函数,则自动存储+调用构造函数等效于此类C++.

// C++
int main(void){
  Somestruct myObject;     // calls the default constructor, if there is one
  // destructor will be called at some point when myObject goes out of scope
}


推荐阅读
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • iOS 面试实战:15 道经典面试题及解析
    本文精选了15道iOS面试题,并提供了详细的解答思路。旨在帮助开发者更好地准备面试,避免因准备不足而导致的紧张和焦虑。 ... [详细]
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
  • VMware 15.5.7 中文版激活方法
    本文提供了一种有效的方法来激活 VMware 15.5.7 的中文版本,同时介绍了如何利用最新的激活码进行操作,确保用户能够顺利使用。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • oracle 对硬件环境要求,Oracle 10G数据库软硬件环境的要求 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • MyBatisCodeHelperPro 2.9.3 最新在线免费激活方法
    MyBatisCodeHelperPro 2.9.3 是一款强大的代码生成工具,适用于多种开发环境。本文将介绍如何在线免费激活该工具,帮助开发者提高工作效率。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • T15483.【清华集训2017模拟11.26】简单路径T25484.【清华集训2017模拟11.26】快乐树T35485.【清华集训2017模拟11.26】字符串T1结论题,结论很 ... [详细]
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • Unix与Linux的起源与发展
    本文详细探讨了Unix与Linux的操作系统起源,从自由软件运动的兴起,到Linux内核的诞生,全面解析了这两款操作系统的发展历程及其对现代计算技术的影响。 ... [详细]
  • 题目链接:http://codeforces.com/gym/101190/attachments题意:在一个共享三轮车站点,某些用户需要租用车辆。该问题涉及如何通过离线查询和排序优化策略来高效地管理和分配车辆资源。具体来说,需要设计一种算法,在满足所有用户需求的同时,最小化总等待时间和资源浪费。通过合理的数据结构和算法优化,可以显著提高系统的整体性能和用户体验。 ... [详细]
author-avatar
广告公司英子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有