如何使用C断言让代码更安全?

2024-03-13

阅读杂项。与SDL开发相关的教程我发现了两个不同的例子,做同样的事情,但以不同的方式。我想知道从代码“安全性”和可维护性的角度来看,您认为这两者中哪一个是正确的。

在第一个示例中,程序员根本没有使用断言,但代码看起来不错(至少在我看来):

int main(){
        SDL_Surface *screen;

        /** Initialize SDL */
        if(SDL_Init(SDL_INIT_VIDEO)!=0){
                fprintf(stderr,"Unable to initialize SDL: %s",SDL_GetError());
        }
        atexit(SDL_Quit);

        /** Sets video mode */
        screen=SDL_SetVideoMode(640,480,16,SDL_HWSURFACE);
        if(screen==NULL){
                fprintf(stderr,"Unable to set video mode: %s",SDL_GetError());
        }

        return (0);
}

在第二个示例中,程序员[其他]使用了不同的方法,例如(代码并不完全是复制粘贴):

int main(){
        SDL_Surface* screen;

        /** Initialize SDL */
        assert(SDL_Init(SDL_INIT_VIDEO)==0);
        atexit(SDL_Quit);

        /** Sets video mode */
        screen=SDL_SetVideoMode(640,480,16,SDL_HWSURFACE);
        assert(screen!=NULL);

        return (0);
}

可以用第二个示例中的断言“替换” if 条件(第一个示例中的)吗?

正确的策略是什么(如果有的话)?


进行这种替换是不行的。第二个例子是wrong, 因为assert(x)扩展到nothing在非调试版本中(当NDEBUG被定义为)。这意味着指针签入assert以上已从发布版本的代码中删除。这绝对是错误的。

那么,什么时候应该使用assert?它对于记录 and 调试。在某种程度上,你是在说,“我确信这个条件是正确的,并且我把它放在这里作为一个assert在调试期间捕获错误代码,并向代码读者记录该情况”。

因此,这两个示例之间存在很大差异。对于诸如检查返回值之类的事情malloc, assert是错误的,因为不能保证他们会返回非NULL,正如我上面提到的,assert(x)意思是“我完全确定x是真的”,而不仅仅是“如果x这不是真的,这很糟糕”。为此,人们使用if(x) good(); else bad();控制。

SDL_Init http://sdl.beuc.net/sdl.wiki/SDL_Init and SDL_SetVideoMode http://sdl.beuc.net/sdl.wiki/SDL_SetVideoMode可以返回-1 and NULL分别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用C断言让代码更安全? 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Aws ecs fargate ResourceInitializationError:无法提取机密或注册表身份验证

    我正在尝试在 aws ecs fargate 1 4 0 平台上运行私有存储库 对于私有存储库身份验证 我遵循了docs https docs aws amazon com AmazonECS latest developerguide p
  • 创建删除线文本?

    我可以在 Android 中创建删除线文本吗 我的意思是在TextView标签可以使这成为可能
  • SQL-Server 中的错误计算

    作为一个例子 我发现了一个简单的计算 例如 select cast 200 00 as float 1908 30 170 00 1150 00 1128 30 作为正常添加 这会导致0 00但 SQL Server 显示结果为2 2737
  • fitz.open() 在 for 循环中不起作用(FITZ、PYTHON、PYMUPDF)

    当我尝试使用 PyMuPDF 中的 fitz 迭代目录 PDFS 中的文件时 我遇到了困难 问题是 当我只是执行 document somepdf pdf 时 代码可以工作 但是一旦我插入 for 循环并尝试访问文件 就会出现此错误 文件名
  • Android 记录来电和去电

    我想了解是否有一种方法可以在 Android 手机 2 2 及更高版本上记录来电和去电 客户希望记录他们给客户拨打的代理电话 以便以后可以用来填写一些材料 他们不想让客户在接听电话时等待 而是希望稍后再做 这可能吗 我需要使用哪些 API
  • 如何配置IntelliJ 11 +远程tomcat 6 + maven导入模块?

    这是我现在所拥有的 将多个maven模块导入到IntelliJ项目中 Maven 目标从 Maven 项目弹出窗口运行正常 创建一个 war 文件 从 Build Make Project 创建项目也可以 但这里没有创建战争 只是创建 cl
  • myBatis 中 ArrayList 的类型处理程序

    我正在尝试为 ArrayList 编写类型处理程序 但这给了我错误任何人都可以帮助我 我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其作为 ArrayList 检索 package com someweb typeha
  • 如何在容器中存储不同类型的模板化对象?

    假设我有一个vector or list或任何可能更适合这里的容器 我想将模板化类型的多个对象 或指针 存储在 std vector
  • SCNMaterialProperty不是渲染层

    当分配 AVPlayerLayer 时 SCNMaterialProperty 的内容属性在 SCNMaterial 上无法呈现 请注意 这只是物理设备上的问题 在模拟器 Xcode 6 0 1 上运行良好 我正在这样创建我的 SCNode
  • 在谷歌地图上显示多条路线

    我试图在同一张地图上显示多条路线 但无法这样做 无论我做什么 我都只能得到一条路线 function calcRoute var start document getElementById start value var end docum
  • 从字典中获取特定值

    如何从Python中的字典中获取特定的键 我有一本字典 dict redorange 1 blackhawak 2 garlicbread 3 我想获取其键名称中包含大蒜的键的值 我怎样才能实现它 让我们调用你的字典d print v fo
  • 将 nodemon 与 docker 和 docker-compose 结合使用

    我将 nodemon 与 docker compose 一起使用 这是我的 Dockerfile FROM node 10 WORKDIR usr src app COPY package json RUN npm install COPY
  • 如何从 Apache .htaccess 创建虚拟主机?

    我在用Apache 之友 XAMPP http www apachefriends org en xampp html在 Windows 本地服务器 中 我将虚拟主机设置为httpd vhosts conf在 Apache 配置目录中 如下
  • Android - 在 AsyncTask onPostExecute() 中设置的共享首选项并不总是设置?

    我有一些代码在 98 的时间内有效 在我自己的测试中则为 100 因此除了让用户设备遇到此问题之外 我无法真正重现该问题 我在 onPostExecute 中所做的是设置如下参数 SharedPreferences prefs Prefer
  • 带有方角的 UISegmentedControl

    我想用子类修改 UISegmentedControl 以删除圆角 我似乎无法设置cornerRadius 使 SegmentedControl 比屏幕更宽 因此 切掉 角落 不是一个选择 因为我有 4 或 5 个段 然后它们的大小会有所不同
  • 如何使用 python 连接多个 .wav 文件 [重复]

    这个问题在这里已经有答案了 我看到一篇文章将两个 wav 文件连接在一起 但我想知道如何使用 python 连接多个 wav 文件 我正在使用 python 3 6 0 如果有人有办法做到这一点 请教我 我看到另一篇文章要求加入 2 个 w
  • 更改背景后手指绘画速度变慢

    在我的 Paint 应用程序中 我使用了自定义视图 该视图位于 Finger Paint API 演示中 代码如下 public class MyView extends View private static final float MI
  • NSDateFormatter 中的上午/下午问题

    我编写下面的代码将一种日期格式转换为另一种日期格式 但 AM 字符串有效 PM 无效 请帮忙 dateTime 2013 01 24 18 30 PM dateTime 2013 01 24 06 30 AM NSDateFormatter
  • 在活动组中添加新活动时出现 java.lang.StackOverflowError

    我正进入 状态stackoverflow error 我的布局结构如下
  • 如何使用C断言让代码更安全?

    阅读杂项 与SDL开发相关的教程我发现了两个不同的例子 做同样的事情 但以不同的方式 我想知道从代码 安全性 和可维护性的角度来看 您认为这两者中哪一个是正确的 在第一个示例中 程序员根本没有使用断言 但代码看起来不错 至少在我看来 int