当前位置: 首页 > 知识库问答 >
问题:

用正确的整数类型替换数组访问变量

郑宇
2023-03-14

我有使用int访问数组的习惯(尤其是在for循环中);然而,我最近发现我可能“做错了”,我的x86系统一直对我隐瞒真相。事实证明,当sizeof(size_t)==sizeof(int)时,int很好,但当用于sizeof(size_t)的系统时

下面是一个缩短的示例

int vector_get(int *v,int i){ return v[i]; }

    > movslq    %esi, %rsi
    > movl  (%rdi,%rsi,4), %eax
    > ret

int vector_get(int *v,size_t i){ return v[i]; }

    > movl  (%rdi,%rsi,4), %eax
    > ret

好的,我已经修复了自己(现在使用size\u t和ptrdiff\u t),现在我如何(希望不是手动)在代码中找到这些实例,以便修复它们?

最近我注意到一些补丁,包括从int到size\u t的变化。

我把在每个实例上插入的额外指令放在一起,以显示“做错一切”的结果。

注意:longlongun符号longun符号longsize_tptrdiff_t不需要额外的mov*操作(基本上任何东西

编辑:

我想我可能有一个可行的存根来修补gcc,但我不知道如何在其源代码周围完成存根并添加适当的Wflag位,像往常一样,编程最困难的部分是命名东西-Wunalinged索引?

gcc/c/c-typeck。c

if (!swapped)
    warn_array_subscript_with_type_char (index);
> 
> if ( sizeof(index) < sizeof(size_t) ) 
>   warning_at (loc, OPT_Wunaligned_index,
>       "array index is smaller than size_t");

/* Apply default promotions *after* noticing character types.  */
index = default_conversion (index);

gcc/c-系列/c.opt _____________________________________________

trigraphs
C ObjC C++ ObjC++
-trigraphs  Support ISO C trigraphs
> 
> Wunaligned-index
> C ObjC C++ ObjC++
> Warn about array indices smaller than size_t

undef
C ObjC C++ ObjC++ Var(flag_undef)
Do not predefine system-specific and GCC-specific macros

gcc/c-family/c-opts。c

case OPT_Wtrigraphs:
  cpp_opts->warn_trigraphs = value;
  break;
>
> case OPT_Wunaligned_index:
>   cpp_opts->warn_unaligned_index = value;
>

case OPT_Wundef:
  cpp_opts->warn_undef = value;
  break;

共有2个答案

屠锐
2023-03-14

movslq指令符号将长(即4字节量)扩展为四(即8字节量)。这是因为int是有符号的,因此偏移量,即-1,作为长。如果你只是零扩展(即没有movslq),这将是0x00000000ffffffff,也就是4294967295,这可能不是你想要的。因此,编译器符号扩展索引以产生0xffff ,也称为-1。

其他类型不需要额外操作的原因是,尽管其中一些被签名,它们仍然是相同的8字节大小。而且,由于两个的补码,0xffff...可以解释为-118446744073709551615,64位和仍然相同。

但是请注意,这种“自动零扩展”并不适用于1字节和2字节的数量——这些数量必须手动零扩展。

包子航
2023-03-14
匿名用户

clang和gcc有-Wchar下标,但这只会帮助检测char下标类型。

您可以考虑修改clang或gcc(在您的基础结构上更容易构建的),以扩展由Wchar下标检测到的类型。如果这是一次性修复,那么这可能是最简单的方法

否则,您需要找到一个抱怨非size\u t/ptrdiff\u t订阅的linter;我不知道有谁有这个选择。

 类似资料:
  • 问题内容: 我有一个类,可以根据消息的类将传入的消息映射到匹配的读者。所有消息类型都实现接口消息。读者在mapper类中注册,说明它将能够处理的消息类型。这些信息需要以某种方式存储在消息阅读器中,而我的方法是从构造函数中设置一个数组。 现在,似乎我对泛型和/或数组有些误解,似乎无法弄清楚,请参见下面的代码。它是什么? ETA : 正如cletus正确指出的那样,最基本的谷歌搜索表明Java不允许通

  • 问题内容: 只要我有键值对,解组就非常简单了,但是我将如何以不同的顺序解组不同类型的数组呢?单个元素定义明确且已知,但顺序不明确。 我无法提出一个漂亮的解决方案。 我会尝试对所有元素进行错误处理吗?是否有某种工会类型可以为我做到这一点? 游乐场版 问题答案: Go官方博客上有一篇不错的文章:JSON和GO。可以将“任意数据解码”到接口{}中,并使用类型断言来动态确定类型。 您的代码可能可以修改为:

  • 我使用和。我有一个带有方法的控制器,其中包含作为url参数的数组: 为什么会发生这种情况?为什么项目中没有显示示例数组?

  • 从本质上讲,我试图遍历变量的内容,实现replace函数,并打印相应的更改。当我执行代码时,变量被打印出来,只是没有得到预期的结果。 预期结果如下: Lorem ipsum dolor坐在那里,有些字符串是有价值的,这是非常重要的。这是一个非常小的问题,当然也可以锻炼身体。在谴责中,在谴责中,在谴责中,在谴责中,在谴责中,在谴责中,在谴责中,在谴责中,在谴责中,在谴责中,在谴责中,在谴责中,在谴责

  • 问题内容: 尝试从我知道仅包含整数的数组中获取最高和最低值似乎比我想象的要难。 我希望这能显示出来。相反,它显示。因此,似乎排序是将值作为字符串处理。 有没有一种方法可以使sort函数对整数值进行实际排序? 问题答案: 默认情况下,sort方法按字母顺序对元素进行排序。要进行数字排序,只需添加一个处理数字排序的新方法(sortNumber,如下所示)- 在ES6中,可以使用箭头功能简化此操作: 说

  • 问题内容: 我有一个类型为C的C文件,可以这样称呼它,例如: 我需要使用Go转到该C数组的索引,并将数组项转换为Go字符串。以下代码可以编译,但不能正常运行;您可以从下面的输出中看到,它是沿着字符串而不是数组进行索引: …结果是这样的: 仅供参考,这样做的目的是在服务器上解码在运行C的嵌入式平台上创建的日志文件,因此需要重新使用相同的日志记录索引文件。 我已经随机刺了几个小时,但没有成功。谁能纠正