前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 动态新闻推送 第43期

C++ 动态新闻推送 第43期

作者头像
王很水
发布2021-12-28 11:45:43
3620
发布2021-12-28 11:45:43
举报

C++ 动态新闻推送 第43期

reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态

资讯

标准委员会邮件列表 12月

zstd 1.5.1 发布相比旧版有很大性能提升,和lz4很接近了

Intel oneAPI Toolkits 2022 Released 包括TBB在内的一系列更新

文章

之前也介绍过Jason Turner的这个书,实际上一直是开源的,之前也有人总结过,关注进展的可以点点star

最近不是出了一个新链接器linker mold比ld快么,作者研究一下为啥ld lld慢 (很多能做并行化的地方没做)

linker我不是很懂,可以读读

简单说就是optional T&比T*表达效果更好

静态代码检查公司,介绍了他们公司分析代码遇到的十个典型bug,这里列几个好笑的

代码语言:javascript
复制
void
gsk_vulkan_image_upload_regions (GskVulkanImage    *self,
                                 GskVulkanUploader *uploader,
                                 guint              num_regions,
                                 GskImageRegion    *regions)
{
  ....
  for (int i = 0; i < num_regions; i++)
  {
    m = mem + offset;
    if (regions[i].stride == regions[i].width * 4)
    {
      memcpy (m, regions[i].data, regions[i].stride * regions[i].height);
    }
    else
    {
      for (gsize r = 0; r < regions[i].height; i++)          // <=
        memcpy (m + r * regions[i].width * 4,
                regions[i].data + r * regions[i].stride, regions[i].width * 4);
    }
    ....
  }
  ....
}

坑爹的循环用错变量。。。

代码语言:javascript
复制
QString QPixelTool::aboutText() const
{
  const QList<QScreen *> screens = QGuiApplication::screens();
  const QScreen *windowScreen = windowHandle()->screen();

  QString result;
  QTextStream str(&result);
  str << "<html></head><body><h2>Qt Pixeltool</h2><p>Qt " << QT_VERSION_STR
    << "</p><p>Copyright (C) 2017 The Qt Company Ltd.</p><h3>Screens</h3><ul>";
  for (const QScreen *screen : screens)
    str << "<li>" << (screen == windowScreen ? "* " : "  ")
        << screen << "</li>";
  str << "<ul></body></html>";
  return result;
}

html字符串不匹配 最后应该是/ul

代码语言:javascript
复制
#define PM_EXP2(A) 1 << A

int process_val(const u_int8_t *data, u_int32_t data_len,
                               u_int32_t *retvalue, ....) 
{
  *retvalue = 0;
  ....
  /* Now find the actual value */
  for (; i < data_len; i++) {
    *retvalue += data[i] * PM_EXP2(8 * (data_len - i - 1));
  }
  return(0);
}

不安全的宏,A得括起来,不然求职顺序有问题

搞错被除数。这个代码就不列了

代码语言:javascript
复制
// bitsperlong.h
#ifdef CONFIG_64BIT
#define BITS_PER_LONG 64
#else
#define BITS_PER_LONG 32
#endif /* CONFIG_64BIT */

// bits.h
/*
 * Create a contiguous bitmask starting at bit position @l and ending at
 * position @h. For example
 * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
 */
#define __GENMASK(h, l) ....

// master.h
#define I2C_MAX_ADDR      GENMASK(6, 0)

// master.c
static enum i3c_addr_slot_status
i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr)
{
  int status, bitpos = addr * 2;                   // <=

  if (addr > I2C_MAX_ADDR)
    return I3C_ADDR_SLOT_RSVD;

  status = bus->addrslots[bitpos / BITS_PER_LONG];
  status >>= bitpos % BITS_PER_LONG;               // <=

  return status & I3C_ADDR_SLOT_STATUS_MASK;
}

代码的类型不匹配,溢出风险

代码语言:javascript
复制
extern void eFree (void *const ptr);

extern void argDelete (Arguments* const current)
{
  Assert (current != NULL);
  if (current->type ==  ARG_STRING  &&  current->item != NULL)
    eFree (current->item);
  memset (current, 0, sizeof (Arguments));  // <=
  eFree (current);                          // <=
}

// routines.c
extern void eFree (void *const ptr)
{
  Assert (ptr != NULL);
  free (ptr);
}

检测出多余的memset

代码语言:javascript
复制
std::size_t m_trail; 
....
inline int context::execute(const char* data, std::size_t len,
 std::size_t& off)
{
  ....
  case MSGPACK_CS_EXT_8: {
                uint8_t tmp;
                load<uint8_t>(tmp, n);
                m_trail = tmp + 1;
                if(m_trail == 0) {
                    unpack_ext(m_user, n, m_trail, obj);
                    int ret = push_proc(obj, off);
                    if (ret != 0) return ret;
                }
                else {
                    m_cs = MSGPACK_ACS_EXT_VALUE;
                    fixed_trail_again = true;
                }
            } break;
  ....
}

死代码

代码语言:javascript
复制
template<typename T>
static ALWAYS_INLINE void FormatLogMessageAndPrintW(....)
{
  ....
  wchar_t wbuf[512];
  wchar_t* wmessage_buf = wbuf;
  ....
  if (wmessage_buf != wbuf)
  {
    std::free(wbuf);
  }
  if (message_buf != buf)
  {
    std::free(message_buf);
  }
  ....
}

意外释放

如何用宏实现反射?boost decribe库的原理是什么?

代码语言:javascript
复制
truct X
{
  int m1;
  int m2;
};

BOOST_DESCRIBE_STRUCT(X, (), (m1, m2))

代码仓库在这里 挺有意思

其实也见过很多人实现过,就是一些信息/类型通过fixed_string之类的模版藏起来。

视频

cppcon2021基本都放出来了,时间比较紧张,这里慢慢看慢慢总结了,大家有看完了的也可以给咱投稿,咱备注引用/来源

项目

  • ringbuf 又一个ringbuf实现, 实现了扩容,600多行,大部分都是接口,

可以先看个简单版本 理解一下这玩意的原理,再看这个。不过都是玩具,看个乐。想用可以用boost的 circular_buffer (也是支持动态扩容的)

  • asteria 一个脚本语言,可嵌入,作者也在找热心人贡献代码,这里介绍一下
  • zpp_bits c++20序列化库
  • w2c2 一个将WebAssembly转成c的库
  • libgrapheme 一个unicode字符串库

本文永久链接

代码语言:txt
复制
     This site is open source. [Improve this page](https://github.com/wanghenshui/cppweeklynews/edit/dev/posts/043.md).
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++ 动态新闻推送 第43期
    • 资讯
      • 文章
        • 视频
          • 项目
          相关产品与服务
          腾讯云代码分析
          腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档