在Clang中禁用“从指针转换为较小类型uint32_t”错误

时间:2014-01-20 11:11:09

标签: c++ pointers compiler-errors clang

我正在开展一个学校项目,涉及在实验性硬件上移植大量的C ++代码。不幸的是,该硬件是64位的,并且代码包含许多指针算法实例,它们指向指针为32位,即它通常为reinterpret_cast<uint32_t>(ptr)

逐一浏览它们会非常繁琐,因为无论如何这是一个实验项目,我很乐意接受“hackish”解决方案。所以我修改了malloc的实现,以确保它永远不会分配超过4GB限制的内存。从技术上讲,这些演员应该是有效的。

问题是,如何向Clang解释这个?我得到的错误是:error: cast from pointer to smaller type 'uint32_t' (aka 'unsigned int') loses information。有没有办法禁用它?

谢谢, 大卫

5 个答案:

答案 0 :(得分:6)

我同意你应该咬紧牙关并修复代码以使用正确的整数类型。但要回答你的问题:,你无法禁用它,尽管你可以解决它。

许多错误来自警告。一般来说这是一件好事,但是如果你想禁用警告,那就去做吧。由于罪魁祸首可能是-Wall,它可以启用许多警告,因此您应该选择性地禁用此单一警告。错误消息提到负责错误消息的诊断,例如, ... [-Wextra-tokens](如果没有,请删除-fno-diagnostics-show-option标记)。然后,您可以通过添加-Wno-extra-tokens完全禁用此诊断(再次,“额外令牌”警告是一个示例),或通过-Wno-error=extra-tokens将其转换为非致命警告。

但是,这个特定的错误并不是由于警告,我找不到任何禁用错误的选项(这是有道理的,因为大多数错误是致命的)。

但是为了截断整数值而不必修复uint32_t 的所有错误用法,您可以使用static_cast<uint32_t>(reinterpret_cast<uintptr_t>(ptr))。不用说,这仍然是错误的。

答案 1 :(得分:4)

我从Cpplang Slack的某个人那里获得此项后,我可以使用-fms-extensions停用此功能:

  

查看“DiagnosticSemaKinds.td”,它显示为err_bad_reinterpret_cast_small_inthttps://github.com/llvm-mirror/clang/blob/release_50/include/clang/Basic/DiagnosticSemaKinds.td#L6193   “SemaCast.cpp”中有两个出现 - 其中一个表明它对MS扩展敏感,https://github.com/llvm-mirror/clang/blob/release_50/lib/Sema/SemaCast.cpp#L2112   有人可以尝试-fms-extensions(希望不是-fms-compatibility),但这会带来所有的shebang。

答案 2 :(得分:0)

如何使用uintptr_t,你的大多数指针算术仍然有效。

答案 3 :(得分:0)

将此段代码保存为mycast.hpp并将-include mycast.hpp添加到Makefile

#include <cstdint>

template<typename U, typename T>
U Reinterpret_cast(T *x) {
    return (U)(uintptr_t)x;
}

template<typename U, typename T>
U Reinterpret_cast(T &x) {
    return *(U*)&x;
}

#define reinterpret_cast Reinterpret_cast
除非你的代码太棘手,否则他们应该做好自己的工作。

您的策略不适用于堆栈分配的对象,请小心!如有必要,您可以将一些调试/记录逻辑插入Reinterpret_cast

答案 4 :(得分:0)

我在没有C ++ 11的项目中遇到了同样的问题,并且像这样解决了这个问题:

<title>