C++ C++;类型索引散列导致未定义的行为

C++ C++;类型索引散列导致未定义的行为,c++,c++11,clang,sanitizer,C++,C++11,Clang,Sanitizer,遵循上的示例并使用-fsanitize=address,integer,undefined编译会显示未定义的行为。代码是: struct A { virtual ~A() {} }; struct B : A { }; struct C : A { }; int main() { std::unordered_map<std::type_index, std::string> type_names; std::cout << "A"

遵循上的示例并使用
-fsanitize=address,integer,undefined
编译会显示未定义的行为。代码是:

struct A
{
  virtual ~A()
  {}
};

struct B : A
{
};
struct C : A
{
};

int main() {
  std::unordered_map<std::type_index, std::string> type_names;
  std::cout << "A" << std::endl;
  type_names[std::type_index(typeid(int))] = "int";
  std::cout << "B" << std::endl;

  type_names[std::type_index(typeid(double))] = "double";
  std::cout << "C" << std::endl;

  type_names[std::type_index(typeid(A))] = "A";
  std::cout << "D" << std::endl;

  type_names[std::type_index(typeid(B))] = "B";
  std::cout << "E" << std::endl;

  type_names[std::type_index(typeid(C))] = "C";
  std::cout << "F" << std::endl;

  return 0;
}

如图所示,clang抱怨用户定义类型的未定义行为。有人知道不导致未定义行为的正确实现是什么样子的吗?

无符号整数溢出不是未定义行为,但是UBSan仍然有一个选项来检查它,因为它通常仍然是一个bug。但在这种情况下不是这样。此警告是由一个完全无辜的哈希函数引起的。它应该有无符号整数溢出

你可以接受这个警告

您还可以向libc++维护人员报告一个bug。他们或许应该补充一点

__attribute__((no_sanitize("integer")))

或是一些类似的错误函数。

谢谢!在查看源代码后,我认为它很可能是无害的,因为它是一个用于查找的哈希值,但是对于将警告wrt发送到stand library有点惊讶。您是否知道是否有办法忽略整个stdlib?也就是说,非路径特定,因此它可以在多个系统上工作。无需担心。找到了一个例子herehttps://github.com/RobotLocomotion/drake/blob/master/tools/dynamic_analysis/ubsan.supp
__attribute__((no_sanitize("integer")))