混合 C++ 异常处理和 SEH (Windows)

2024-02-22

我有一个函数,我在其中调用getaddrinfo()得到一个sockaddr*其目标内存是由系统分配的。 许多人可能知道,您需要致电freeaddrinfo()释放由 getaddrinfo() 分配的内存。

现在,在我的函数中,有几个地方可能会抛出异常,因为某些函数失败了。 我的第一个解决方案是合并freeaddrinfo()到每个 if 块中。 但这对我来说确实很难看,因为无论如何我都必须在函数返回之前调用它,所以我想出了 SEH 的 try-finally...

但我遇到的问题是,不允许将 throw 语句编码到 __try-block 中

然后,我阅读了 msdn 并尝试将 throw 语句交换到从 __try-block 内调用的辅助函数中...瞧,编译器不再抱怨了...

这是为什么?这安全吗?这对我来说没有意义:/

Code:

void function()
{
    //...
    addrinfo* pFinal;
    __try
    {
        getaddrinfo(..., &pFinal);

        //if(DoSomething1() == FAILED)
        //  throw(exception);           //error C2712: Cannot use __try in functions that require object unwinding

        //but this works
        Helper();


        //...

    }
    __finally
    {
        freeaddrinfo();
    }
}


void Helper()
{
    throw(Exception);
}

EDIT:

尝试了以下方法,它适用于抛出整数,但当我使用类作为异常时则不起作用:

class X
{
public:
    X(){};
    ~X(){};
};


void Helper()
{
    throw(X());
}


void base()
{
    __try
        {
            std::cout << "entering __try\n";

            Helper();

            std::cout << "leaving __try\n";
        }
        __finally
        {
            std::cout << "in __finally\n";
        }
};


int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        base();
    }
    catch(int& X)
    {
        std::cout << "caught a X" << std::endl;
    }

    std::cin.get();
    return 0;
}

Why? :/


您不能混合使用两种异常类型。在幕后,C++ 异常使用 SEH,而您的 SEH 异常处理程序可能会扰乱异常传播逻辑。因此,C++ 编译器不允许您混合它们。

PS:结构化异常处理几乎总是一个非常糟糕的主意。 Microsoft 内部已禁止使用 SEH,除非在非常有限的情况下。任何使用结构化异常处理的组件都会自动受到intense代码审查(我们有工具扫描代码以查找其用途,以确保不会遗漏任何情况)。

SEH 的问题在于,使用 SEH 时很容易意外引入安全漏洞。

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

混合 C++ 异常处理和 SEH (Windows) 的相关文章

  • 从 Dropbox C# 下载文件[重复]

    这个问题在这里已经有答案了 我正在尝试下载 Dropbox 中的 pdf 文件 我需要将其保存到本地计算机中 可以是任何文件夹C Users User Desktop例如 这是我一直在使用的代码 public void DownloadPd
  • 数据结构的优化存储以实现快速查找和持久化

    Scenario 我有以下方法 public void AddItemSecurity int itemId int userIds public int GetValidItemIds int userId 最初我正在考虑表单上的存储 i
  • C/C++ 程序是在 CPU 上运行还是在内核上运行?

    我已经编程很多年了 但有一件事我一直不明白 有两种类型的编程语言 编译型语言和解释型语言 编译型语言首先需要编译成解释型语言 然后才能执行 例如 C C 需要先编译为机器语言 然后才能执行 我的问题来了 谁真正运行已编译的 C C Wind
  • MVC 中的 Blazor:组件被渲染,但 @onclick 不起作用。连接问题

    我正在尝试在 net core 3 MVC 项目中使用 Blazor 我使用了一些教程来做到这一点 例如https fizzylogic nl 2019 08 18 integrating blazor in an existing asp
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 使用 CMake 对 SDL 的未定义引用

    我正在使用 SDL v1 2 15 7 和 CMake 3 2 1 开发一个项目 在 h 文件中我添加了 include
  • 如何(可移植地)在 C 和 C++ 中获取 DBL_EPSILON

    我正在 Linux AS 3 上使用 GCC 3 4 并试图找出DBL EPSILON 或者至少是一个不错的近似值 我怎样才能以编程方式获取它 在 C 中是std numeric limits
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 二维数组的列求和

    我有一个IEnumerable
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • C 中函数“fgets”的参数太少

    每当我编译这个错误时 我都会收到该错误 但我不知道为什么 我直接从书上抄袭这个 有人可以帮忙吗 include
  • FOSRestBundle:显示我的自定义异常消息

    我试图在 FOSRestBundle 中添加异常的自定义控制 但它似乎忽略了我的自定义消息 响应的状态代码正常 I have throw new HttpException 404 User id not found 但得到这个 json
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • matplotlib 获取给定图形包含的所有轴以应用某些设置

    我正在编写一个函数来修改图形上的轴大小和位置 但是当出现双轴时 就会出现问题 import matplotlib pyplot as plt def fig layout fig vspace 0 3 function to make sp
  • 如何在mysql中插入印度泰卢固语字符

    我想将印度语言 泰卢固语 存储在我的数据库表中 但它显示 将泰卢固语数据插入我的表时 我已经验证了如下内容 SHOW VARIABLES LIKE character set system 它显示的输出如下Character set sys
  • 在 Excel 中创建列公式,仅更改一个变量

    我有一个非常基本的 Excel 文件 用于查看股票成本并计算利润 亏损百分比 我在单元格 E3 中有初始购买价格 在 F3 中有当前股价 我通过以下公式计算了 G3 的盈利 亏损百分比 F3 E3 100 100 我现在想要的是 当我在 F
  • 将远程上游添加到 bitbucket 上的 git 存储库

    对于 GitHub 我添加了一个名为upstream使用以下命令获取我的分叉存储库的最新更改 git remote add upstream email protected cdn cgi l email protection
  • 如何在 VBA/VBScript 中执行 onclick 事件

    td class highlightTab style background color red color yellow a class highlightTabLabel href 我仍在尝试通过网页学习 Excel 自动化 我试图使用
  • 错误:无法创建目录 \app\build\intermediates\incremental\packageDebug\zip-cache

    构建工作项目后突然显示错误 如何解决这个错误 错误 无法创建目录 app build intermediates incremental packageDebug zip cache 我尝试了以下解决方案 Delete gradle fro
  • Next.JS:如何在服务器端发出所有请求

    我正在构建一个Next JS https github com zeit next js将从 Python API 和 Postgres 数据库获取数据的应用程序 通常这很简单 但要求是我需要从服务器端而不是用户的客户端发送所有请求 我一直
  • R twitterR 搜索Twitter 地理编码警告/错误

    我正在尝试使用 twitteR 包提取推文 但是当我按照他们在文档中的方式指定地理编码时 在通过 searchTwitter 函数获取推文时遇到问题 请看下面的代码 Oauth code successful authentication
  • Maven:无法安装第 3 方 jar

    尝试将第 3 方 jar 安装到我的存储库 alfresco repository jar 中 我正在使用以下命令 mvn install install file DgroupId alfresco DartifactId alfresc
  • 如何编辑(更新)JSON 文件 flutter 中的数据

    我正在尝试将特定值更新为外部存储中的 JSON 文件 虽然我可以写入该文件 但它正在用单个数据替换整个 JSON 文件 这个是用单个值替换整个文档 Future setBookmark int questionId String isBoo
  • 画布中图像上的圆角

    我有一张画布 里面有图像 我希望在图像的两个角上放置圆角 我想这样做的方法是使用全球运营商之一 但我似乎不知道如何做到这一点 任何帮助 将不胜感激 不要使用全局运算符 而是计算出您希望图像占据的空间 应该是除圆角之外的矩形路径 然后在绘制图
  • 如何在Wix中引用heat.exe生成的wxs文件中的File元素

    我将为我的网络项目创建设置 我用http blog bartdemeyer be 2013 10 create an installer for website with wix part 1 http blog bartdemeyer b
  • 为什么 Bootstrap-3 中没有 col-xs-offset-* 类?

    我读到Twitter Bootstrap 3 文档 http getbootstrap com css grid offsetting它不支持col xs offset 类 这似乎不符合移动优先 有充分的理由吗 我认为它们可能有用 I re
  • Bootstrap 图标栏未显示

    调整浏览器大小时 Bootstrap 导航栏菜单中的图标栏不显示 http jsbin com ixAqinA 1 http jsbin com ixAqinA 1 section class container div class nav
  • 如何显示当前文件上传的缩略图或预览

    我无法显示预览video image being loaded 基本上我的意思是说下面的代码不是firing to get video image preview 这是我的Jsfiddle http jsfiddle net ChJ9B 1
  • 不同的 CSS 背景图像取决于月份和年份

    基本上 我有一个带有文本的 div 我希望背景根据月份和年份显示不同的图像 我怎样才能实现这个目标 任何帮助将不胜感激 我已经准备了 4 年的每月图像 标记为 month0 2011 png 到 month11 2014 png 如果有帮助
  • HttpListener:如何获取http用户和密码?

    我在这里遇到了 HttpListener 的问题 当表单请求 http user email protected cdn cgi l email protection 制作完成后 如何获取用户名和密码 HttpWebRequest 有一个
  • 静态 boost::wregex 实例是线程安全的吗?

    使用固定的 boost wregex 声明静态 全局变量 然后从多个线程使用它 而不用担心正则表达式的内部状态 如果 Boost 已使用 BOOST HAS THREADS 进行编译 是否安全 e g boost wregex g rege
  • 通过 Hibernate 获取 PL/SQL 函数的返回值

    我在 Oracle 数据库中有一个无法更改的 PL SQL 函数 该函数采用一个标识实体的参数 创建该实体的副本 然后返回副本的 ID 这看起来像 函数 copy entity id IN NUMBER 返回号码 我需要从 Hibernat
  • 混合 C++ 异常处理和 SEH (Windows)

    我有一个函数 我在其中调用getaddrinfo 得到一个sockaddr 其目标内存是由系统分配的 许多人可能知道 您需要致电freeaddrinfo 释放由 getaddrinfo 分配的内存 现在 在我的函数中 有几个地方可能会抛出异