如何在 VC++ 中毒害标识符?

2023-11-23

功能中毒在 C++ 中是非常有用的技术。

一般来说,它指的是使某个功能不可用,例如如果您想禁止在程序中使用动态分配,您可以"poison"malloc 函数因此无法使用。“中毒”标识符意味着“中毒”之后对标识符的任何引用都是硬编译器错误

例如(参见现场演示here)

#include <iostream>
#include <cstdlib>
#pragma GCC poison malloc
int main()
{
    int* p=(int*)malloc(sizeof(int));  // compiler error use of poisoned function malloc
    *p=3;
    std::cout<<*p<<'\n';
    free(p);
}

我发现这种技术对于防止误用 C++ 中的保留字非常有用。

例如:

#include "test.h"            // contains definition of some class T
#pragma GCC poison private
#define private public      // oops compiler error use of poisoned identifier private in macro
int main()
{
        // Instantiate T & use it members
}

这也可以在 C 中使用,以防止使用 C++ 关键字,因为 C++ 比 C 有更多关键字,并且在 C 中使用 C++ 特定关键字作为标识符是完全有效的。

例如(参见现场演示here)

#include <stdio.h>
#pragma GCC poison new
int main(void)
{
     int new=5;     // oops compiler error use of poisoned identifer new.
     printf("%d",new);
}

但是要使用这种中毒,我们需要使用实现定义的 pragma 指令。幸运的是,由 clang & 识别的 GCC 编译指示也能很好地工作。但是如果我有 VC++ 编译器(Microsoft Visual studio),则需要哪个编译指示。如何在VC++编译器中做到这一点?


MSVC++ 有两种方法可以做到这一点。要获取您要使用的 GCC 版本#pragma 已弃用。这会产生警告 C4995,您可以使用 /WX 将其转换为错误。

然而,这会毒害具有您指定的名称的任何标识符,它的选择性不足以防止对恰好具有相同标识符名称的 C++ 成员发出警告。例如,您不能使用它来弃用特定的函数重载。通过第二种方式解决,__declspec(已弃用).

一般来说,您更喜欢后者以避免意外匹配。但请注意,它存在先有鸡还是先有蛋的问题,您只能弃用编译器知道的函数。比如说,强制您 #include 一个您根本不想使用的标头。

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

如何在 VC++ 中毒害标识符? 的相关文章

随机推荐

  • 在 matlab 中保存 imagesc 的精确图像输出

    你好 我想保存这张图片imagesc magic 3 确切的彩虹表示 可能吗 Thanks 这个问题可能看起来像重复的问题 但事实并非如此 我在这个网站上查看了类似问题的解决方案 但它并不令我满意 我查看了 Matlab 帮助中心 得到的最
  • android ffmpeg .so下载[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人知道从哪里获得 Android 编译的 so FFMPEG 库吗 我尝试了数千次使用 Android NDK 在 windows 7 上手动编译
  • 接受 YouTube 的 cookie 同意

    我正在尝试从 Youtube 频道检索 Youtube 视频列表 例如 https www youtube com user YouTube videos 以获得第 n 个第一个视频 感谢key videoId 它曾经像魅力一样发挥作用 直
  • Oracle中的游标for循环

    请解释一下如何在 oracle 中使用游标 for 循环 如果我使用下一个代码 一切都很好 for rec in select id name from students loop do anything end loop 但是如果我为这个
  • 绘制一个奇特的对角相关矩阵,其系数位于上三角形中

    我有以下内容合成的数据框 包括数值 and 绝对的列以及label柱子 我想绘制一个对角相关矩阵并在上部显示相关系数 如下所示 预期产出 尽管合成数据集 数据帧中的分类列df需要转换成数值 到目前为止我已经用过这个海伯恩的例子 using
  • 如何以角度获取前一个日期?

    请帮我获取 Angular 4 中之前的日期 currentdate Date this currentdate new Date console log this datePipe transform this currentdate y
  • 如何在 OpenNLP 中训练命名实体识别器标识符?

    好的 我有以下代码来训练来自 OpenNLP 的 NER 标识符 FileReader fileReader new FileReader train txt ObjectStream fileStream new PlainTextByL
  • 子集的积和

    这个操作有名字吗 并且 是否存在封闭式表达式 对于给定的 n 个元素集合 k 值介于 1 和 n 之间 获取 k 个项目的所有子集 组合 求每个子集的乘积 求所有这些乘积的总和 我可以用 Python 表达这一点 并且很容易地进行计算 fr
  • 用非IO事件中断epoll_wait,没有信号

    当前场景是 epoll wait 超过几个 fd 和一个可能传入消息的队列 我希望 epoll wait 下面的循环在 IO 事件或新消息上执行 我知道的方法 Use a time毫秒超时并在循环中首先检查队列 Use the 自管技巧当消
  • 当兼容模式打开时,Font Awesome 4.2.0 无法在 IE11 中呈现

    Font Awesome 4 2 0 在 Chrome Firefox Safari Opera 和 Internet Explorer 11 中完美呈现 但仅限于 关闭 兼容模式 当兼容模式打开 打开 时 不会渲染任何字形图标 我尝试过使
  • 嵌套有序列表与数字、字母和罗马数字的组合进行编号?

    我想创建一个如下所示的有序列表 1 Item 1 2 Item 2 a Subitem 1 b Subitem 2 I Sub Subitem 1 II Sub Subitem 2 c Subtiem 3 3 Item 3 即子列表应使用字
  • 修改 Info.plist 以在运行时设置“Application is agent(UIElement)”

    假设我需要让用户能够通过首选项面板选择是否将该应用程序用作 标准 带有停靠图标和菜单 或作为代理应用程序 仅带有状态栏菜单 我想我需要在执行期间以编程方式修改应用程序的 Info plist 将参数 应用程序是代理 更改为是 否 这是正确的
  • 内核模块中的 EXPORT_SYMBOL | insmod 期间未定义的符号

    我有一个来自 a ko 内核模块 的导出函数 foo 和 foo1 foo1 接受输入参数 一个函数指针 我从 b ko 调用 foo1 并将 foo 作为输入参数传递 我看到 b ko 未知符号 foo 的 insmod 失败 即使 a
  • Java 11 HttpClient - HttpClient 与并发 HttpRequest 的最佳比率是多少

    在下面的示例中 我创建一个 Java 11 httpClient 然后创建多个并发 HttpRequest 这是不好的做法吗 每个 HttpRequest 都应该有自己的 HttpClient 吗 HttpClient 可以拥有的 Http
  • 使用 gsub 删除第一个数字字符之前的所有字符串

    使用 gsub 删除 R 中第一个空格之前的所有字符串 在此示例中 我们尝试删除空格之前的所有内容sub 1 D name 我正在寻找非常相似的东西 但我对正则表达式不太熟悉 我想删除第一个数字字符之前的所有内容 但不删除它 例如 x lt
  • UI5控件的生命周期是如何运作的?

    有人可以更详细地解释 UI5 控件默认事件的生命周期吗 我知道有文档中的此页面它概述了控件生命周期 但是 我认为它非常简短 需要更详细的内容 有人可以列出控件事件的顺序并解释每个事件的作用吗 你是绝对正确的 控件生命周期的详细信息和实现细节
  • 如何使用 SSL/TLS 和/或消息级安全保护 RESTful php Web 服务

    我有一个用 php 编写的 RESTful Web 服务 它使用 JSON 进行通信 传输的一些数据确实很敏感 密码 我正在寻找一种方法来实现服务的合理安全级别 客户端是 silverlight 4 应用程序 我一直在寻找有关如何实施 SS
  • NodeJS 的 Web Sockets 服务器端实现

    这个问题的部分原因可能是客户端的讨论太多 让我只见树木不见森林 无论如何 这就是我想做的 我需要一个独立于平台的 WebSocket 服务器端实现 我希望它在 NodeJS 中运行 现在 我发现的有关该主题的内容 99 都与 socket
  • 如何使用照片框架快速循环浏览照片库

    我有一个应用程序 可以为我的应用程序上的每张门票创建一个独特的照片库 我需要弄清楚如何循环浏览该画廊 以便我可以一次将一张图像上传到服务器 我在 YouTube 上遵循了这些教程 Video 我目前使用 Swift 作为我的语言 我的最终目
  • 如何在 VC++ 中毒害标识符?

    功能中毒在 C 中是非常有用的技术 一般来说 它指的是使某个功能不可用 例如如果您想禁止在程序中使用动态分配 您可以 poison malloc 函数因此无法使用 中毒 标识符意味着 中毒 之后对标识符的任何引用都是硬编译器错误 例如 参见