从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。
每周更新
欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue
众所周知c++有很多安全问题,整形溢出提升,内存泄漏,使用已经释放的指针(UAF)
google chrome团队介绍了一些让c++代码更安全的方法,
- 删掉/减少裸指针的使用,这里有一篇文档来说明减少裸指针的方案,google已经在实施中
- 生命周期控制
[clang::lifetimebound]]
但这个有点缺陷,google还没开始,但这个是可行的- 自动内存管理 引用计数或者GC 这里google内部有个Oilpan Garbage Collector 使用后还是有一定效果的
- 实现所有权分析 google没说怎么实现,但是是类似rust的方案,类似refcell
- 使用
-Wdangling-gsl
虽然有误报但效果还行- 确认标准库函数的所有表现,确定行为 abseil组在做
- 迭代器访问安全,有CheckedIterator
- 整型语义确定清晰,避免各种溢出提升之类的坑爹问题 没用
-fwrapv
或者UBSan with trap-on-failure 直接用base/numerics里面的Trapping<T>
- free的指针标记为nullptr
-fno-delete-null-pointer-check
- 代码的设计上规避生命周期控制问题
absl::variant
代替基于enum的状态机- 禁止
std::unique_ptr::get
拿裸指针,使用shared_ptr
- 所有用到内存的地方都得初始化
-ftrivial-auto-var-init=pattern
- 移除原生数组,换成
std::array
- 避免共享
- DCHECK NOTREACHED都收纳到CHECK宏里面实现
- 避免MOVE后使用 类似UAF的问题
介绍一下一些减少裸指针的方案
文档中列举了各种小组件的优缺点
关于miracleptr,这里有个资料汇总没有细看。感觉值得单独抽出来讲讲
介绍了一下c最新的提案(发展)
- N2645 -
#elifdef
and#elifndef
没啥意思- N2626 - Digit Separators
const unsigned magical_number = 1'633'902'946;
方便近视眼- N2630 - Formatted input/output of binary integer numbers 支持%b
- N2680 - Specific Width Length Modifiers 还是标识符
printf("%w128d", my_128bit_integer);
- N2683 - Towards Integer Safety 加了几个函数帮助查溢出问题,
-fwrapv
的语言层支持- N2709 - Adding a Fundamental Type for N-bit Integers
_BitInt(N)
- N2713 - Integer Constant Expressions (and their use for Arrays)
int x[(int)+1.0];
????谁这么写代码- N2686 - #warning directive 好功能 这玩意cmake里用message。语言级别支持肯定更好
- N2728 - char16_t & char32_t String Literals Shall be UTF-16 and UTF-32 不懂
- N2799 - __has_include 这个c++也有
一个坑爹的未定义行为
If a conversion specification is invalid, the behavior is undefined.
具体的原因可以看原博客
指定标识符的缺陷就在这里。所以说,能用fmt用fmt
TODO: 看不懂
TODO: 网页打不开
比较了enable_if和require实现同等功能的编译速度。结论,各种编译器表现不一,但是差不太多
- On Clang, C++20
requires
is significantly worse than the rest.- On GCC 10.3, the extra-value-parameter method is significantly better than the rest.
- On MSVC, the extra-type-parameter method seems worse than the other two SFINAE methods, and C++20
requires
seems to be operating on a different polynomial from the rest.
手把手教你用module
如果用auto 尽量用const auto 或者const auto &