Categories
程式開發

盤點C++ 開源項目中的十大Bug


又一年即將結束,是時候盤點一下開源項目中的Bug 了。 2020 年的盤點可能還需要點時間,本文我們先來看看2019 年開源C/C++ 項目中遇到的一些最有趣的槽點。

No. 10. 我們正運行在什麼操作系統上?

V1040 可能拼寫錯誤預定義宏名稱。 ‘MINGW32_’有點兒像’MINGW32 __’。winapi.h 4112

#if !defined(__UNICODE_STRING_DEFINED) && defined(__MINGW32_)
#define __UNICODE_STRING_DEFINED
#endif

MINGW32_ 宏的名稱拼寫有誤(MINGW32 實際上被聲明為MINGW32__)。在項目的其它地方,拼寫是正確的:

盤點C++ 開源項目中的十大Bug 1

順便說一句,這個bug 並不是在文章”CMake: the Case when the Project’s Quality is Unforgivable”中首次被描述,而是在一個開源項目的V1040 診斷中就真正被第一次發現的bug(2019 年8月19 日)。

https://www.viva64.com/en/b/0658/?ref=hackernoon.com

No. 9. 哪個先?

V502 可能’?:’運算符的工作方式與預期不符。 ‘?:’運算符的優先級比’==’運算符低。 mir_parser.cpp 884

enum Opcode : uint8 {
  kOpUndef,
  ....
  OP_intrinsiccall,
  OP_intrinsiccallassigned,
  ....
  kOpLast,
};
bool MIRParser::ParseStmtIntrinsiccall(StmtNodePtr &stmt, bool isAssigned) {
  Opcode o = !isAssigned ? (....)
                         : (....);
  auto *intrnCallNode = mod.CurFuncCodeMemPool()->New(....);
  lexer.NextToken();
  if (o == !isAssigned ? OP_intrinsiccall : OP_intrinsiccallassigned) {
    intrnCallNode->SetIntrinsic(GetIntrinsicID(lexer.GetTokenKind()));
  } else {
    intrnCallNode->SetIntrinsic(static_cast(....));
  }
  ....
}

我們感興趣的下面的部分:

if (o == !isAssigned ? OP_intrinsiccall : OP_intrinsiccallassigned) {
  ....
}

原文鏈接:【https://www.infoq.cn/article/1xBVGHDW3EbNDBD1eM81】。未經作者許可,禁止轉載。