Skip to content
败犬日报 2025-11-19

败犬日报 2025-11-19

1. Cloudflare 崩了 (2025/11/18)

Everyone laughs when AWS collapses, everyone is silent when Cloudflare collapses. Why? Because the place to laugh has collapsed.


官方发了复盘 https://blog.cloudflare.com/18-november-2025-outage/


rust unwrap() 是一种 Fail Fast 理念,在这里用是不适合的(这是个滚动刷新的配置,非法情况应该是屏蔽更新并告警)。但也是事故里问题较小的一个。

主要问题在于流程,为什么安全审计、测试、灰度这些流程都没有查出问题,这是绝对不应该的。


10 月 20 日 AWS 爆炸,10 月 29 日 Azure 爆炸,11 月 18 日 cloudflaure 爆炸,这么短时间集中爆炸很壮观了。

2. bool 值表示

bool 的值表示,就是存储的值是 0 1 还是其他,这是 ABI 定义的。例如 system v abi 规定了 false 用 0 表示,true 用 1 表示(最后有参考和解释)。

c++ 标准定义了 bool 只可能包含两个值 false true,以及 false true 转换为整数会变成 0 1。但是 false true 的表示没有规定,它们是 100 和 200 也符合标准。

因此这个说法是错误的:“bool 值表示是 0 和非 0,可以为 0..255 中间的任意值”。


再举个编译器优化的例子:

cpp
#include <bit>

bool foo(bool a)
{
    auto x = std::bit_cast<char>(a);
    return x == 0 || x == 1;
}

// foo(bool):
//         mov     al, 1
//         ret

上面例子用 clang 21.1.0 -std=c++20 -O3 编译,bar 直接返回了 1,可见在这个 ABI 限制下 bool 不可能是非 01 值。


同时,严格来说标准是不保证 bool memset 为 0 的效果的,不过恰好所有实现都把全零当成 false,所以 memset 0 总是能用的。


关于 abi 的解释,system v abi (x86-64) 有记载:

Booleans, when stored in a memory object, are stored as single byte objects the value of which is always 0 (false) or 1 (true). When stored in integer registers (except for passing as arguments), all 8 bytes of the register are significant; any nonzero value is considered true.

翻译:布尔值存储在内存对象中时,以单字节对象的形式存储,其值始终为 0(假)或 1(真)。而存储在整数寄存器中时(作为参数传递的情况除外),寄存器的全部 8 个字节都有效;任何非零值都被视为真。

这部分有点奇怪。system v abi 突然规定函数内部寄存器用非 0 表示 true,可是 abi 是接口,不应该规定函数内部怎么实现。所以我在上面直接说 false 用 0 表示,true 用 1 表示,应该没问题吧。

itanium c++ abi 没找到相关规定,应该是因为不需要重复定义了。

3. reference_wrapper 相比于裸指针有啥优势

reference_wrapper 相比于引用应该大家都知道了,是可以拷贝、重新绑定。因此用于传参(比如 std::thread)是最大的使用场景。

相比于裸指针,reference_wrapper 保证非空勉强算一个优势。

4. 哪里看 C++ 标准的编译器支持情况

https://cppstat.dev/

cppref 还在维护,更新没那么及时。