是漂亮计数器惯用语的错误还是格式不正确的静态订单惨败?

2023-11-29

以下代码在 clang 中崩溃(x86_64-pc-linux-gnu 上的版本 5.0.0-3~16.04.1),但在 gcc (9.2.0) 中运行良好。

struct Registry {
    static int registerType(int type) {
        std::cout << "registering: " << type;
        return type;
    }
};

template<typename T>
struct A {
    static int i;
};

template<typename T>
int A<T>::i = Registry::registerType(9);

int main() {
    std::cout << A<int>::i << std::endl;    
}

根据地址清理程序,clang 崩溃的原因是:

ASAN:DEADLYSIGNAL
=================================================================
==31334==ERROR: AddressSanitizer: SEGV on unknown address 0xffffffffffffffe8 (pc 0x7f5cc12b0bb6 bp 0x7ffdca3d1a20 sp 0x7ffdca3d19e0 T0)
==31334==The signal is caused by a READ memory access.
    #0 0x7f5cc12b0bb5 in std::ostream::sentry::sentry(std::ostream&) /root/orig/gcc-9.2.0/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/ostream.tcc:48:31
    #1 0x7f5cc12b11e6 in std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) /root/orig/gcc-9.2.0/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/ostream_insert.h:82:39
    #2 0x4197a7 in __cxx_global_var_init.1 (/tmp/1576534654.656283/a.out+0x4197a7)
    #3 0x514eac in __libc_csu_init (/tmp/1576534654.656283/a.out+0x514eac)
    #4 0x7f5cc02847be in __libc_start_main /build/glibc-Cl5G7W/glibc-2.23/csu/../csu/libc-start.c:247
    #5 0x419858 in _start (/tmp/1576534654.656283/a.out+0x419858)

这是 clang 中漂亮计数器习惯用法的错误,还是格式不正确的静态初始化顺序惨败的示例?


Edit

根据接受的答案,问题可以改写为:

  • 难道全球ostream object std::cout是不是没有正确初始化?
  • 是否存在允许编译器不具有的有效情况std::cout初始化,即使我们包含 iostream 并且我们使用std::cout适当地?
  • 是否存在在普通设备上崩溃的用例cout << "foo"是不是编译器bug?

为了避免剧透,我只是暗示答案是Yes。这种情况可能会发生,但不用担心,有解决方法。想看更多请关注下面接受的答案.

同样根据接受的答案,所讨论的情况可以缩小到一个更基本的场景:

int foo() {
    std::cout << "foo";
    return 0;
}

template<typename T>
struct A {
    static int i;
};

template<typename T>
int A<T>::i = foo();

int main() {
    (void) A<int>::i;    
}

在上述 clang 版本上崩溃(看起来,这是合理的!)。


不幸的是,该代码具有未指定的行为。其原因即使不是通常的定义,也类似于静态初始化顺序失败。

物体std::cout和其他类似的对象声明<iostream>不能在该类型的第一个对象之前使用std::ios_base::Init已初始化。包括<iostream>定义(或充当定义)具有静态存储持续时间的该类型的非本地对象([iostream.objects.概述]/3)。这可以满足大多数情况下的要求,即使std::cout和朋友在动态初始化期间使用,因为Init翻译单元中的定义通常比任何其他非本地静态存储对象定义更早。

然而,[基本.启动.动态]/1 says

如果变量是隐式或显式实例化的专门化,则具有静态存储持续时间的非局部变量的动态初始化是无序的,...

所以虽然初始化std::ios_base::Init对象(有效)定义在<iostream>被命令,初始化A<int>::i是无序的,因此这两个初始化的顺序是不确定的。所以我们不能指望这段代码能够正常工作。

正如 @walnut 在评论中提到的,可以通过强制另一个来纠正代码std::ios_base::Init动态初始化期间要初始化的对象A<int>::i使用前std::cout:

struct Registry {
    static int registerType(int type) {
        static std::ios_base::Init force_init;
        std::cout << "registering: " << type;
        return type;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是漂亮计数器惯用语的错误还是格式不正确的静态订单惨败? 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • 如何知道一个StorageFolder-obj属于SD还是Phone?

    有没有办法知道 StorageFolder obj 属于 SD 或 WP8 1 上的手机 感谢您 例如 您可以通过检查Path of StorageFolder or StorageFIle string folderPath yourSt
  • 如何在jsPDF生成的PDF中添加水印?

    我正在从canva 生成PDF 并使用jsPDF 生成它 https github com MrRio jsPDF 这是我正在使用的代码 我想将水印添加到页面中 有人能帮我吗 self downloadCanvasObjectAsPDF f
  • 导入错误:没有名为 requests 的模块

    我知道有很多关于此的帖子 并且我尝试使用提供的解决方案 但无济于事 我试过pip install requests and pip install requests upgrade pip install requests upgrade
  • 没有标签的“for”属性的自定义复选框(Bootstrap 4)

    有没有办法仍然保留 Bootstrap 4 自定义复选框样式不使用 the id关于输入和属性for标签上 当您删除它时 检查的样式不存在 Example div class custom control custom checkbox m
  • 使用 jQuery 以像素为单位的填充或边距值作为整数

    jQuery 具有 height 和 width 函数 它们以整数形式返回像素的高度或宽度 如何获取元素的填充或边距值以像素和整数为单位使用 jQuery 我的第一个想法是执行以下操作 var padding parseInt jQuery
  • 需要帮助将格式 20120130 的日期转换为日期数据类型 oracle sql

    您能帮我将日期从 20120101 格式转换为 Orcle Sql 中的 DATE 格式吗 我看了这个link但它没有提到日期格式是否是自定义的 编辑 是否可以将任何排除规则写入转换函数 像这样的 99999999 到 9999 12 31
  • Firefox 浏览器不会重新加载更新的 CSS/JS 文件

    我在 Firefox 浏览器中遇到问题 因为每次更新 CSS 或 JS 文件时 我都需要清除 Firefox 浏览器的缓存才能获取更新的文件 我使用 XSP2 服务器是因为我在 ubuntu 中使用 C 和 asp net 开发了我的 we
  • Java真的很慢吗?

    Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 Java有在某种程度上因缓慢而闻名 Java真的很慢吗 如果是 为什么 瓶颈在 或曾经 在哪里 是因为 JVM 效率低下吗 垃圾收
  • array_unique() 是否通过引用修改其数组?

    我使用后array unique 在数组上 当我var dump 数组 它仍然具有相同的内容 但有重复 array 21 0 gt string 10 tricou CRS 1 gt string 10 tricou CRM 2 gt st
  • C 调用约定和传递参数

    在 Linux 或 OS X 中进行函数调用时 被调用者可以修改堆栈上参数的值吗 我的假设是 由于调用者是清理它们的人 因此它们在函数调用后应该包含相同的值 但是我发现带有 O2 的 GCC 正在修改在堆栈上传递给它的参数 我还查找了包括
  • 为什么 openCV 的 fastNlMeansDenoisingColored() 给出错误?

    我是菜鸟openCV概念 所以如果我的问题很愚蠢 请原谅我 实际上我正在尝试应用Photo fastNlMeansDenoisingColored 方法 但我不明白为什么它会给出这样的错误 Code Mat tmp new Mat bitm
  • 将 R 中的参数传递给多个实数变量的函数

    我是 R 的新手 需要解决多目标优化问题 MOOP 我已经导入了 mco 包 定义了我的函数并检查了 nsga2 函数 问题是 当前者与数字变量匹配时 我还没有找到绑定函数定义中的参数 形式参数 和调用中的参数 实际参数 的正确方法 我有以
  • xampp 上的 LDAP 配置

    我一直在尝试在 xampp localhost 上配置 ldap 我在 php ini 文件中启用了 ldap 扩展 我也尝试过更改系统变量 我不断收到此错误 LDAP 功能不存在 加载模块 ldap php 模块或使用编译有 ldap 支
  • UITabBarController 仅显示其 UITabBar 的一半(屏幕外)

    当我从 UIViewController 呈现 UITabBarController 后 我的 UITabBar 没有完全显示 请你告诉我我做错了什么吗 我的代码是 some method LoggedInViewController lv
  • R:熔化和铸造

    我有一个这样的数据集 CASE ID c C1 C1 C2 C2 C2 C3 C4 PERSON ID c 1 0 7 8 1 20 7 PERSON DIVISION c Zone 1 NA Zone 1 Zone 3 Zone 1 Zo
  • if($variable) 究竟是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 关于PHP中的if语句 在 PHP 脚本中 像这样的 if 语句检查什么 我已经多次看到它在脚本中使用 现在我真的很想知道它 寻找 什么 它没有缺少任何东西 它只是 if 语句中的一个普通变量 我在任
  • 在asp.net中显示按月和年分组的记录

    我需要按我的 asp net 页面上显示的日期 月和年 对记录进行排序 任何想法 建议都会有帮助 这是我目前拥有的代码 table width 40 border 0 style margin left auto margin right
  • 使用 pandas 转换 Excel 样式日期

    我必须解析一个 xml 文件 该文件为我提供 Excel 样式的日期时间 例如 42580 3333333333 Pandas 是否提供了一种将该数字转换为常规数字的方法datetime object 好吧 我认为最简单的事情就是构建一个T
  • 如何修复空指针异常

    我一直在尝试修复这个空指针异常 但我不能 我知道它指向一个空对象 但我不知道如何修复它 我是 Java 编程的初学者 所以如果这是一个愚蠢的问题 请不要生气 这是我的代码 import android app Activity import
  • 是漂亮计数器惯用语的错误还是格式不正确的静态订单惨败?

    以下代码在 clang 中崩溃 x86 64 pc linux gnu 上的版本 5 0 0 3 16 04 1 但在 gcc 9 2 0 中运行良好 struct Registry static int registerType int