如何解决:“剧组从大小不同的整数指针”中的C代码的警告?(How to resolve: “cast

2019-07-30 18:18发布

我从一个旧的代码去除GCC警告。

是否有可能通过抑制铸字“转换为指针从大小不同的整数”警告:

example:

some_struct *ptr = func()  // func() returns an integer.

是否有人可以指导我如何解决这样的GCC警告?

Answer 1:

首先,如果你能解决func (允许修改其源),然后解决它。 如果它的计算可以用指针来完成,然后做他们的指针和返回指针。 有时也有正当的理由与作为整数地址的工作(例如,处理特殊代码对齐问题)。 在这种情况下,变化func使用uintptr_t类型(在定义stdint.h )。 它是专为治疗指针为整数,如果必要。 (也有intptr_t如果符号的算术是出于某种原因更好,但我通常发现的无符号uintptr_t要少麻烦。)最好, func应的转换uintptr_t返回时,它的指针,这样的返回类型func将是一个指针(的东西,也许some_structvoid )。

如果你不能修复func ,那么你可以使用强制类型转换告诉你打算做的正在执行的转换的编译器。 然而,该特定错误消息告诉你,你不仅仅是一个整数转换为一个指针,但你是为另一尺寸(例如,八个字节)的指针将一个尺寸(例如,四个字节)的整数。 很可能这些代码最初是为一个系统,通过返回的整数类型书面func所具有尺寸为指针类型相同,但现在你正在编译的系统中指针类型比整数尺寸更大或更小的。

在这种情况下,你必须确保所执行的运算func在新架构的工作原理。 如果只返回一个32位的值,将始终保持正确的价值? 也就是说,什么都不会受到丢失的高32位会丢失? 没有该地址func应该永远计算超过它使用整数类型的最大值? 如果func使用符号整型,考虑符号位了。

如果您已确保返回的值func是正确的,那么你可以使用显式转换,如: some_struct *ptr = (some_struct *) (intptr_t) func();



Answer 2:

我的gcc不给你列举了警告。 这也将是奇怪的,因为在你的代码中没有投。

我得到的警告

assignment makes pointer from integer without a cast

请注意,“不进行强制转换”部分。 因此,你可以通过铸造(不改变行为)让GCC沉默:

some_struct *ptr = (void*)func();

然后,你会得到你的警告(“来自大小不同的整数转换为指针”),当且仅当的返回类型func不适合的地址。 这可以通过额外地铸造被沉默func()到合适的整数类型,例如intptr_t

some_struct *ptr = (void*)(intptr_t)func();

所有这一切的假设下,你真的想错了大小的整数转换为指针。 也许,返工的代码是一个更好的主意。



Answer 3:

这里有两种可能性:

  1. func是铸造的实际指针的整数; 它后来被用作一个指针。
  2. func返回了被存储在一个指针的整数; ptr稍后强制转换为整数,并用作一个整数。

在第一种情况下,从返回值func丢失信息 ,并有可能导致崩溃或更糟,如果int比数据指针,这将是对大多数规模较小的64位内存模型 (包括Windows和Linux)。 在这种情况下,你应该改变的返回类型funcintptr_t ; 看到使用的,而不是无效使用intptr_t *? 和为什么/时,使用类型强制转换`intptr_t`用C? 。

在第二种情况下,这是少,但对付你应该通过投排列顺序问题一个问题的intptr_tsome_struct *ptr = (some_struct *)(intptr_t)func(); 后来int value = (int)(intptr_t)ptr; 。 见GLib的类型转换宏对这一问题的讨论。



文章来源: How to resolve: “cast to pointer from integer of different size” warning in C code?