前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 中文周刊 第91期

C++ 中文周刊 第91期

作者头像
王很水
发布2022-12-31 16:01:56
4540
发布2022-12-31 16:01:56
举报

C++ 中文周刊 第91期

资讯

编译器信息最新动态推荐关注hellogcc公众号 本周更新 2022-11-30 第178期

文章

离谱,freebsd的ping 有溢出漏洞

关键字

放在变量前

放在static/thread_local前

放在函数前

常量表达式前

const

可以

可以

成员函数

有时可以

constexpr

可以 (初始化得是constexpr的)

可以

必须是满足constexpr属性的函数

可以

consteval

不行

不行

满足consteval的函数

接受返回值,可以

constinit

不行

必须常量初始化

不行

不行

未定义行为 不一定是实现决定,未定义行为就是 未定义行为, 就是可能任何事都会发生,别想当然

列了一堆c的资料以及语法细节

代码语言:javascript
复制
[[nodiscard]] constexpr auto if_hell(bool c1, bool c2) {
    if (c1) {
        if (c2) {
            return true;
        } else {
            throw;
        }
    }

    // ...

    return false;
}

static_assert(not if_hell(false, false));
static_assert(not if_hell(false, true));
assert(throws([]{ if_hell(true, false)); }));
static_assert(if_hell(true, true));

[[nodiscard]] constexpr auto if_heaven(bool c1, bool c2) {
    if (not c1) {
        return false;
    }

    if (not c2) {
        throw;
    }

    // ...

    return true;
}

static_assert(not if_heaven(false, false));
static_assert(not if_heaven(false, true));
assert(throws([]{ if_heaven(true, false)); }));
static_assert(if_heaven(true, true));

别写if_hell这种面条。尽量提前结束

看代码

代码语言:javascript
复制
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

uint8_t tab[0x1ff + 1];

uint8_t f(int32_t x)
{
    if (x < 0)
        return 0;
    int32_t i = x * 0x1ff / 0xffff;
    if (i >= 0 && i < sizeof(tab)) {
        printf("tab[%d] looks safe because %d is between [0;%d[\n", i, i, (int)sizeof(tab));
        return tab[i];
    }

    return 0;
}

int main(int ac, char **av)
{
    return f(atoi(av[1]));
}

一个经典UB,既然溢出是UB,那么GCC就假定永远不会溢出,这里的条件判断统统删除,所以执行一个溢出的数,直接coredump

大家有时间可以读一下UB指南 https://blog.regehr.org/archives/213 没工夫读的,我总结一下

说过挺多次了。就是有些场景引用可能带来副作用,对于引用主动decay copy成值语义

讲反射的。代码写的和boost.fpr(magic_get)差不多吧

用静态分析抓bug。场景都特简单

代码语言:javascript
复制
int main() {
   std::vector<int> data{ 1,1,2,3,5,8,13,21,34,55 };
   for (auto it = data.begin(); it != data.end();) {
      /* do something with *it */
      if (*it % 2 == 0) {
         data.erase(it);
      } else {
         ++it;
      }
   }
   for (auto const& e : data)
      std::cout << e << '\n';
}

问题出在哪里?入门级

代码写错,

代码语言:javascript
复制
  if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp))!=0)
  if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0)) //括号匹配错了

第二种写法gcc告警很不清晰

代码语言:javascript
复制
2.c:17:72: warning: size argument in 'memcmp' call is a comparison [-Wmemsize-comparison]
  if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0))
                                                     ~~~~~~~~~~~~~~~~~~^~~
2.c:17:7: note: did you mean to compare the result of 'memcmp' instead?
  if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0))
      ^                                                                   ~
                                                                       )
2.c:17:54: note: explicitly cast the argument to size_t to silence this warning
  if (memcmp(m_result_original, m_result_my_version, sizeof(struct tmp)!=0))
                                                     ^
                                                     (size_t)(            )
1 warning generated.

这种问题怎么规避?

介绍oilpan的。一个GC框架,Chrome V8引入这个GC,又支持了pointer compression 指针压缩。指针48位明显用不完,olipan搞到了32位,还有压缩空间

讲windows API的。没怎么看懂。Raymond Chen高产似母猪啊

看不懂

视频

代码在这里 https://github.com/stdgraph/graph-v2

老哥非常乐观

还能这么玩???

开源项目需要人手

  • asteria 一个脚本语言,可嵌入,长期找人,希望胖友们帮帮忙,也可以加群384042845和作者对线
  • pika 一个nosql 存储, redis over rocksdb,非常需要人贡献代码胖友们, 感兴趣的欢迎加群294254078前来对线

新项目介绍/版本更新

工作招聘

开始刷leetcode了。现在工作真卷啊,算法题我都忘光了

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++ 中文周刊 第91期
    • 资讯
      • 文章
        • 视频
          • 开源项目需要人手
            • 新项目介绍/版本更新
              • 工作招聘
              相关产品与服务
              文件存储
              文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档