首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

先别急着“用Rust重写”,可能没有说那么安全

不开玩笑,“一试倾心”说就是 Rust。 太忙了,没时间?不行,这事特别重要,一定要用 Rust 把原有代码资产重写一遍! 一次重写,终身受益。你系统将更快、安全!...用 Rust 重写问题 很多朋友并不清楚,单纯用内存安全语言重写大型 C/C++ 系统组件只会引入额外攻击面:新组件和现有代码间外部函数接口(FFI)。...如果 C 程序使用 add_twice 来更新内存相关数据(例如将缓冲区大小加倍 2 次),则“安全”Rust 函数其实原本“不安全”C 函数更糟糕。...C/C++ 与 Rust 交互时可能引发几种内存安问题类型 图一:rusTLS FFI 函数安全问题示例。异常安全:(1)如果克隆操作耗尽内存,则可引发跨 FFI 边界展开。...异常安全 Rust 会通过展开堆栈并在过程调用析构函数(destructor)方式来处理不可恢复错误(通常用 panic!

36230

C++异常

✨个人主页: 北 海 所属专栏: C++修行之路 操作环境: Visual Studio 2022 版本 17.6.5 文章目录 前言 ️正文 1.异常基本概念 1.1.C语言异常处理方式 1.2...并不会这样直接抛出一个字符串,而是构建一个 异常信息类,抛出一个 异常对象,类包罗万象,需要包含最基本两个信息:错误码、错误信息 // 异常信息类 class Exception { public:...在标准库函数,就采用了这种规范写法 C++98 异常规范过于繁琐,由于异常规范并非强制性语法,实际使用过程中有很多人都不会遵守,于是在 C++11 异常规范进行了相关更新,化繁为简,只需使用一个...,统一进行处理 4.异常优缺点 异常优点 可以展示丰富错误信息,更好定位程序 Bug 错误码是层层返回,不方便定位问题,而异常是则直接被捕获 很多第三方库都包含了异常,需要与其进行兼容...,OO 语言基本都是使用异常处理错误,这是大势所趋 总结 以上就是本次关于C++异常全部内容了,异常处理是软件开发重要错误管理工具,本文深入探讨了异常基本概念、C++处理方式、使用技巧和异常体系设计

17810
您找到你想要的搜索结果了吗?
是的
没有找到

【译】编程语言内存模型 Programming Language Memory Models

硬件编译器容易提供相干性,因为硬件可以应用动态优化:它可以根据给定内存读写序列涉及的确切地址来调整优化路径;相反,编译器只能应用静态优化:它们必须提前写出指令序列,该指令序列无论涉及什么地址和值都将是正确...宽松原子性重新引入了 Java 关于如何定义有竞争程序复杂性。结果是 C++ 模型 Java 模型复杂,但对程序员帮助更少。...如果 C++ 采用 DRF-SC or Catch Fire 有效禁止了带有数据竞争程序,那太好了,这意味着我们可以摒弃之前看到那些奇怪例子,这样 C++ 语言规范最终行为会比 Java 简单很多...为了构造顺序一致原子变量抽象,有时唯一选择是使用严格必要更多和昂贵屏障,特别是在 ARM 和 POWER 上。...除了这些与其他语言基本相同挑战外,ES2017 定义还有两个有趣错误,这两个错误是由于与新 ARMv8 原子指令语义不匹配而引起

1.6K20

C++异常机制

实际C语言基本都是使用返回错误方式处理错误,部分情况下使用终止程序处理非常严重错误。...二、C++异常概念 异常是一种处理错误方式,当一个函数发现自己无法处理错误时就可以抛出异常,让函数直接或间接调用者处理这个错误。 throw: 当问题出现时,程序会抛出一个异常。...异常重新抛出 有可能单个 catch 不能完全处理一个异常,在进行一些校正处理以后,希望再交给外层调用链函数来处理,catch 则可以通过重新抛出将异常传递给上层函数进行处理。...,因为一个项目中如果大家随意抛异常,那么外层调用者基本就没办法玩了,所以实际中都会定义一套继承规范体系。...在函数调用链,深层函数返回了错误,那么我们得层层返回错误,最外层才能拿到错误

8410

C++异常

图片 异常重新抛出 有可能单个catch不能完全处理一个异常,在进行一些矫正处理后,希望再交给外层调用链函数来处理,catch则可以通过重新抛出将异常传递给上层函数进行处理。...这里写了一个服务器开发通常使用异常继承体系,父类Exceptionwhat函数是虚函数,供子类去完成重写,构成多态。...C++异常经常会导致资源泄漏问题,比如在new和delete抛出了异常,导致内存泄漏,在lock和unlock之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题,关于RAII后续我会在智能指针篇章进行介绍...new (std::size_t size) throw (std::bad_alloc); 由于这个规范不具有强制性,且C++标准库里异常体系较为混乱,一般而言实际很少项目会去用库里异常体系。...new和构造函数) 图片 在C++11异常规范进行了简化:函数后面接noexcept,表示函数不抛异常

38800

伙计们,Go 并没有那么简单

回到简单的话题:Go 让我选择不使用异常,这使事情简单了。...它们当然绝对不应该像 C++ 那样复杂(或者其他一些奇怪语言)。...这些可能只是 channel 类型方法。 iota - 基本一样,但奇怪枚举。 内置复数。 if 支持短语句(有时可能有用,但 if 语法其他语言中复杂) 我想就是这样。...在某些方面,Go 可能这些语言简单,有些则不是...大致上我会说它和其他常用语言平均差不多。我也不认为简单,无论是感觉上还是实际使用,最终体验很重要。 最后,这篇文章从哪里来,作者是谁?...我和 Rust 社区有同样问题,请不要介意,我也知道离开那些狂热支持者会更好。 (Q:“你能否在 Rust 重写项目?”

78260

Rust漫画 #3 | 二次元 Rust Meetup 讨论会:Rewrite it in Rust 是否有害?

但是也需要 C/C++ 端不要错误调用回调函数异常安全问题 Rust 如果发生了跨 FFI 边界 Panic 会造成未定义行为,但目前处理这类问题主要依赖程序员自己编码。...空指针访问:FFI 函数没有充分校验指针参数是否为 null 就直接解引用,可能导致空指针访问错误。...总之,R3系统通过在FFI边界两侧增加自动化静态和动态检查,可以大幅减少手写FFI胶水代码时引入安全问题。 “关于 Rust 重写有害论,有人给出一个典故来类比 Rust 重写重要性。...目前企业和社区 Rust 与 C/Cpp 安全交互主要有三种方法: 建立 《Rust 编码规范》 和 《Unsafe 代码安全评审指南》,并加强 Unsafe 代码安全评审 建立 Rust 和 C++...关于第一条,各个公司应该有自己《Rust 编码规范》,比如 Google、facebook和华为等,只不过没有开源出来。

48310

C++ 实用指南

这是我首选语言,但你必须承认,它对值类“大杂烩”实现是很怪异。包括我在内大多数程序员喜欢简单、定义明确语言结构,而不是奇怪和复杂语法。 C++ 在各个方面都很清晰吗?...我们已经看到很多关于 C++11 之前旧版 C++ 抱怨。人们花了将近 13 年时间(从主要 C++98 算起,不包括次要 C++03)才提出新主要版本:C++11。...这可能会带来一些混合代码,但还是只保留老旧风格要好。 最后底线:你旧代码仍然可以编译 C++ 规范越来越大原因之一是该语言向后兼容。所以委员会通常会引入新特性,但很少删除旧东西。...有时你会收到一些关于不推荐使用内容或删除特性警告(如 C++17 auto_ptr),但即使在这种情况下,你也可以将编译器切换到一些较旧 C++ 标准。...:) 我认为你不必快速追逐新特性并立即重写现有代码。

50920

JAVA和C++对比学习

来声明函数形式,然后用一个对象实现这个接口,最后把整个对象作为函数指针载体来操作 现代脚本语言基本都有类似函数指针设计,用以简化“回调”。...异常可以是任何类型数据,不强制处理 应该使用异常代替错误码返回值,而且应该通过宏功能让异常加入更多源代码信息,程序员应该强制自己处理所有的异常。...,也无法主动回收; JAVA对象使用起来较简单,但是没有C++标准析构规则,对于非内存资源,需要手动关闭,要在代码文档强调对close()方法调用,new和close要成对使用 3.2 基本变量类型...严格按照声明类型使用,并且小心记录自己长度 JAVA数组是一种定长容器,下标溢出会有异常抛出 4 面向对象 4.1 多重继承 C++直接可以多重继承,因此引出了虚继承等比较复杂概念 大部分情况下多重继承都容易让事情变得复杂...权限内容 4.5 构造器 C++有初始化列表,可以在其中选择不同基类构造函数 JAVA在子类构造器假模假样调用一下选择基类构造器,实际上那行代码并非在那个时间被调用 JAVA缺乏明确初始化个成员以及自己语法

2.6K40

异常讲解

如系统很多库接口函数都是通过把错误码放到errno,表示错误实际C语言基本都是使用返回错误方式处理错误,部分情况下使用终止程序处理非常严重错误。...不能完全处理一个异常,在进行一些校正处理以后,希望再交给外层调用链函数来处理,catch则可以通过重新抛出将异常传递给上层函数进行处理。...异常规范 异常规格说明目的是为了让函数使用者知道该函数可能抛出异常有哪些。...4.自定义异常体系 其实异常规范很多人都不会用,实际使用很多公司都会自定义自己异常体系进行规范异常管理,因为一个项目中如果大家随意抛异常,那么外层调用者基本就没办法使用了,所以实际中都会定义一套继承规范体系...C++标准库异常体系定义得不好,导致大家各自定义各自异常体系,非常混乱。 异常尽量规范使用,否则后果不堪设想,随意抛异常,外层捕获用户苦不堪言。

8010

编程语言内存模型

对于汇编语言版本,在x86上打印0是不可能,尽管由于处理器本身重新排序优化,在ARM和POWER等更宽松架构上打印0是可能。...不能优化掉冗余读取会阻碍大多数编译器,使生成代码变慢。 硬件编译器容易提供一致性,因为硬件可以应用动态优化:它可以根据给定内存读写序列涉及的确切地址来调整优化路径。...“relaxed”原子性重新引入了Java关于定义什么是竞争程序所有复杂性。结果是C++模型Java复杂,但对程序员帮助更小。...关于DRF-SC或Catch Fire论点详细介绍,参见Boehm,“内存模型原理”(2007) 和Boehm和Adve,“C++并发内存模型基础”(2008)。...如果C++采用DRF-SC或Catch Fire——实际上不允许有数据竞争程序——意味着我们可以扔掉前面看到所有奇怪例子,那么C++语言规范将比Java语言规范简单,那就太好了。

71830

【笔记】《Effective C++》条款26-55

: 基本承诺: 如果异常被抛出, 程序所有事务仍然保持在有效状态下, 不会有类似互斥锁没有释放情况, 但有可能改变部分程序状态, 例如流读取记号改变 强烈保证: 如果异常被抛出, 程序状态不改变.... copy and swap并不总有强烈保证, 这是因为函数内部常常存在连带影响, 几个异常安全函数由于可能修改了外部数据而导致它们结合体不再安全 强烈保证许多时候需要巨大开销来实现, 因此基本保证最终才是最常用...这种特性会在你试图使用多态缺省参数值时产生非常奇怪效果, 因此千万不要重新定义 这种需求可以用NVI手法进行一定程度解决, 因为协议我们永远不应该重写非虚函数, 所以在非虚函数设置缺省参数是安全..., 只和重载一样和名称与参数有关, 所以很容易二义 复杂情况是下图"菱形继承": 菱形继承, 对于不同基类都拥有的同名成员, C++默认会复制多份以供使用, 如果不希望复制就应该使用虚继承,...是用来弥补C++缺少反射机制模板库, 目的是对使用类型进行一些基本信息提取.

90130

初识Rust

另外之前有新闻说golang正在准备2.0,2.0版本即将加入泛型支持,然后导致很多语法不兼容和语法分析得重写。所以我还是懒得踩这个坑了,至少等2.0出来再说。...我认为这种方式Exception机制要好得多得多得多。像C/C++之类得语言,会推荐返回错误码。但是这种错误码一般只有一个整数,能够提供得信息很少,而且如果被漏判了很难发现。...生命周期和转移语义 在看Rust文档过程,看得出来Rust设计哲学是尽可能地无运行时开销并在编译期发现更多地错误。并且要求你关注失败和避免意料之外地开销。...而如果指定了 查找名 ,所有测试名称包含 查找名 都会执行。 在运行测试时候,panic! 之类宏不会再崩溃,而是输出错误信息。额外还有一些测试专用宏 assert!...基本上文档就是个快速上手版本,里面有些细节功能我没有写,我之前想找怎么附加链接选项就没查到。

1.5K40

c++异常

实际C语言基本都是使用返回错误方式处理错误,部分情况下使用终止程序处理非常严重 错误。...二、C++异常概念         异常是一种处理错误方式,当一个函数发现自己无法处理错误时就可以抛出异常,让函数直接或间接调用者处理这个错误。...在成员函数noexcept出现在需要跟在const及引用限定符后面,而final(修饰虚函数,表示该虚函数不能再被重写)、 override(检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错...当然在现代硬件速度很快情况下,这个影响基本忽略不计。 3. C++没有垃圾回收机制,资源需要自己管理。有了异常非常容易导致内存泄漏、死锁等异常安全问题。...二、函数是否抛异常、抛什么异常,都使用 func() throw();方式规范化。 总结:异常总体而言,利大于弊,所以工程我们还是鼓励使用异常

15810

C++异常

实际C语言基本都是使用返回错误方式来处理错误,部分情况下会终止程序来处理一些非常严重错误。...C++ 通常使用 RAII 来解决以上问题,关于 RAII 我们会在智能指针章节进行讲解。...5、异常规范 由于不规范使用异常会带来许多非常严重后果,所以 C++98 引入了异常规范异常规范建议程序员对每个函数进行异常接口说明,其目的是让函数使用者知道该函数可能抛出异常有哪些,如下: 通过在函数后面接...这是因为父类 what 是虚函数,而所有的子类都对 what 进行了重写;同时,main 函数 catch 形参是父类类型引用;当捕获到子类对象时这里就会触发多态,去调用子类对象 what...总结:异常总体而言利大于弊,所以在工程开发我们是鼓励使用异常;另外面向对象语言基本都是用异常处理错误,这也是大势所趋。

40420

关于Java基础你不得不会34个问题

31 关于 final 关键字一些总结 32 Java 异常处理 33 Java序列化如果有些字段不想进行序列化 怎么办 34 获取用键盘输入常用两种方法 参考 1....关于JVM,JDK,JRE和OpenJDK之间区别,Oracle博客帖子在2012年有一个详细答案: 问:OpenJDK存储库源代码与用于构建Oracle JDK代码之间有什么区别?...Java和C++区别 我知道很多人没学过 C++,但是面试官就是没事喜欢拿咱们 Java 和 C++ 呀!没办法!!!就算没学过C++,也要记下来!...简述线程,程序,进程基本概念.以及他们之间关系是什么? 线程与进程相似,但线程是一个进程更小执行单位。一个进程在其执行过程可以产生多个线程。...注意:异常错误区别:异常能被程序本身可以处理,错误是无法处理。

93420

【附答案】关于Java基础你不得不会34个问题

31 关于 final 关键字一些总结 32 Java 异常处理 33 Java序列化如果有些字段不想进行序列化 怎么办 34 获取用键盘输入常用两种方法 参考 1....关于JVM,JDK,JRE和OpenJDK之间区别,Oracle博客帖子在2012年有一个详细答案: 问:OpenJDK存储库源代码与用于构建Oracle JDK代码之间有什么区别?...Java和C++区别 我知道很多人没学过 C++,但是面试官就是没事喜欢拿咱们 Java 和 C++ 呀!没办法!!!就算没学过C++,也要记下来!...简述线程,程序,进程基本概念.以及他们之间关系是什么? 线程与进程相似,但线程是一个进程更小执行单位。一个进程在其执行过程可以产生多个线程。...注意:异常错误区别:异常能被程序本身可以处理,错误是无法处理。

47230

关于Java基础34个问题

关于JVM,JDK,JRE和OpenJDK之间区别,Oracle博客帖子在2012年有一个详细答案: 问:OpenJDK存储库源代码与用于构建Oracle JDK代码之间有什么区别?...Java和C++区别 我知道很多人没学过 C++,但是面试官就是没事喜欢拿咱们 Java 和 C++ 呀!没办法!!!就算没学过C++,也要记下来!...,是一种模板设计,接口是行为抽象,是一种行为规范。...简述线程,程序,进程基本概念.以及他们之间关系是什么? 线程与进程相似,但线程是一个进程更小执行单位。一个进程在其执行过程可以产生多个线程。...注意:异常错误区别:异常能被程序本身可以处理,错误是无法处理。

1.6K50

C++异常介绍和分析

这个不是很常用,了解一下 实际C语言基本都是使用返回错误方式处理错误,部分情况下使用终止程序处理非常严重错误。...有可能单个catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给外层调用链函数来处 理,catch则可以通过重新抛出将异常传递给上层函数进行处理 double Division...) C++异常经常会导致资源泄漏问题,比如在new和delete抛出了异常,导致内存泄漏,在lock和 unlock之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题,关于RAII我们智能指针这节进行..., void* ptr) throw(); 4.自定义异常体系 实际使用很多公司都会自定义自己异常体系进行规范异常管理,因为一个项目中如果大家随意抛异常,那么外层调用者基本就没办法玩了,所以实际中都会定义一套继承规范体系...总结 异常总体而言,利大于弊,所以工程我们还是鼓励使用异常。另外OO,java等语言基本都是用异常处理错误,这也可以看出这是大势所趋。

79320

Java 基础常见知识点&面试题总结(上),2022 最新版!

关于 JVM,JDK,JRE 和 OpenJDK 之间区别, 博客帖子在 2012 年有一个详细答案: 问:OpenJDK 存储库源代码与用于构建 JDK 代码之间有什么区别?...Java 和 C++ 区别? 我知道很多人没学过 C++,但是面试官就是没事喜欢拿咱们 Java 和 C++ 呀!没办法!!!就算没学过 C++,也要记下来。...区别点 重载方法 重写方法 发生范围 同一个类 子类 参数列表 必须修改 一定不能修改 返回类型 可修改 子类方法返回值类型应父类方法返回值类型更小或相等 异常 可修改 子类方法声明抛出异常类应父类方法声明抛出异常类更小或相等...两同”即方法名相同、形参列表相同; “两小”指的是子类方法返回值类型应父类方法返回值类型更小或相等,子类方法声明抛出异常类应父类方法声明抛出异常类更小或相等; “一大”指的是子类方法访问权限应父类方法访问权限更大或相等...⭐️ 关于 重写返回值类型 这里需要额外多说明一下,上面的表述不太清晰准确:如果方法返回类型是 void 和基本数据类型,则返回值重写时不可修改。

36820
领券