ptrdiff_t:在减去时需要转换指针吗?

时间:2013-11-24 18:59:18

标签: pointers

这一行:

   if ((next_parse_point - current_parse_point) > p_chars_per_line)

产生以下警告:

 warning: possible ptrdiff_t overflow

要修复它,我已完成以下操作:

   if (((ptrdiff_t)next_parse_point - (ptrdiff_t)current_parse_point) > p_chars_per_line)

我以为我能够简单地将减法的返回结果转换为ptrdiff_t,而不是必须转换每个参数,例如:

   if ((ptrdiff_t)(p1-p2) > charsPerLine ) ...

但会发出同样的警告。

有人可以提供一个表演,或指向我所缺少的东西吗?

1 个答案:

答案 0 :(得分:2)

这里的解释大致如下:

  1. 您的编译器有一个ptrdiff_t,它是一个不大于平台上指针大小的签名类型。
  2. 无法保证能够以相同长度的签名类型存储任何两个无符号值的差异。
  3. 因为你的两个指针是单字节值,所以从另一个指针中减去一个指针的结果可能会与上面的第2点相悖。
  4. 编译器会警告您这种危险。
  5. 很容易看到8位值发生这种情况 - 如果A = 150且B = 10,那么减法的结果将是无符号8位值中的140,即有符号值中的-116 - 显然,如果您将该值输入比较,则存在危险。在现实生活中,如果你的两个指针超过你的地址空间的一半,这只会是一个危险,这在现在的32位环境中并非完全不可能。

    我的建议是:

    • 重写表达式以避免减法:if((current_parse_point + pchars_per_line) > next_parse_point))

    • 在该表达式周围发出警告

    • 将指针从指针转换为无符号整数,以便编译器认为你 知道你在做什么,并没有警告你。 (IMO这比一个pragma更糟糕,但听起来你的工作环境可能会更快乐了)