C++ 中文周刊 第91期

周刊项目地址

公众号

欢迎投稿,推荐或自荐文章/软件/资源等

可以贴在下一期草稿里 草稿链接

1202


资讯

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

文章

离谱,freebsd的ping 有溢出漏洞

关键字 放在变量前 放在static/thread_local前 放在函数前 常量表达式前
const 可以 可以 成员函数 有时可以
constexpr 可以 (初始化得是constexpr的) 可以 必须是满足constexpr属性的函数 可以
consteval 不行 不行 满足consteval的函数 接受返回值,可以
constinit 不行 必须常量初始化 不行 不行

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

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

[[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这种面条。尽量提前结束

看代码

#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。场景都特简单

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';
}

问题出在哪里?入门级

代码写错,

  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告警很不清晰

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

老哥非常乐观

还能这么玩???

开源项目需要人手

新项目介绍/版本更新

工作招聘

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


本文永久链接

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持! 觉得写的不错那就给点吧, 在线乞讨 微信转账