- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我仍然不明白为什么我收到这个警告 array subscript is above array bounds [-Warray-bounds]
对于一个小的 C 代码如下:
#include <stdio.h>
#include <string.h>
static int _memcmp( const void *x, const void *y, size_t size ){
const char *s1 = (char*)x, *s2 = (char*)y;
int ret;
ret = s1[0] - s2[0];
if ( size == 1 || ret != 0 )
return ret;
ret = s1[1] - s2[1];
if ( size == 2 || ret != 0 )
return ret;
ret = s1[2] - s2[2];
if ( size == 3 || ret != 0 )
return ret;
ret = s1[3] - s2[3];
if ( size == 4 || ret != 0 )
return ret;
ret = s1[4] - s2[4];
if ( size == 5 || ret != 0 )
return ret;
ret = s1[5] - s2[5];
if ( size == 6 || ret != 0 )
return ret;
ret = s1[6] - s2[6];
if ( size == 7 || ret != 0 )
return ret;
ret = s1[7] - s2[7];
if ( size == 8 || ret != 0 )
return ret;
ret = s1[8] - s2[8];
if ( size == 9 || ret != 0 )
return ret;
ret = s1[9] - s2[9];
if ( size == 10 || ret != 0 )
return ret;
//0-20
ret = s1[10] - s2[10];
if ( size == 11 || ret != 0 )
return ret;
ret = s1[11] - s2[11];
if ( size == 12 || ret != 0 )
return ret;
ret = s1[12] - s2[12];
if ( size == 13 || ret != 0 )
return ret;
ret = s1[13] - s2[13];
if ( size == 14 || ret != 0 )
return ret;
ret = s1[14] - s2[14];
if ( size == 15 || ret != 0 )
return ret;
ret = s1[15] - s2[15];
if ( size == 16 || ret != 0 )
return ret;
ret = s1[16] - s2[16];
if ( size == 17 || ret != 0 )
return ret;
ret = s1[17] - s2[17];
if ( size == 18 || ret != 0 )
return ret;
ret = s1[18] - s2[18];
if ( size == 19 || ret != 0 )
return ret;
ret = s1[19] - s2[19];
if ( size == 20 || ret != 0 )
return ret;
return memcmp( s1 + 20, s2 + 20, size - 20 );
}
void t1(){
char *x = "hihihaha";
printf("%d\n", _memcmp( x, "ha", 2 ));
}
void t2(){
char *x = "hihihaha";
printf("%d\n", _memcmp( x, "hi", 2 ));
}
int main(){
return 0;
}
当我使用 03
标志编译时,我得到了这条消息:
gcc-7 -O3 -Wall -o mem_cmp mem_cmp.c
mem_cmp.c: In function ‘_memcmp.part.0.constprop’:
mem_cmp.c:89:23: warning: array subscript is above array bounds [-Warray-bounds]
return memcmp( s1 + 20, s2 + 20, size - 20 );
我尝试过使用 gcc-4.9
和 gcc-5
但没有成功。
编辑:
我很想知道为什么会出现警告,而不是代码风格。 (我很了解memcmp
。当然_memcmp
可以通过for
重新实现,但我想获得一些循环。)
最佳答案
您的memcmp
假定内存s1+20
位于数组s1
中——但事实并非如此。即使编译器没有对此进行提示 - 你也会遇到未定义的行为(可能从程序崩溃到正确执行。这不是你应该回答的。)。主要是从编译磁贴中已知的字符串文字大小推断出这一点。
正确的是
return memcmp( s1, s2, min(strlen(s1),strlen(s2)));
其中 min(x,y)
返回 x
和 y
的最小值。
首先检查大小,然后访问数组。首先进行大小检查,然后索引到数组中。使用 for
循环可以减少此处的重复代码。我的意思是,无论您在那些 if
语句中对不同索引所做的任何操作都可以打包到一个 block 中,以便它可以与 for 循环一起使用(索引变量表示每次迭代中更改的值).
另请注意,如果您最后使用的是 memcmp
,则不要单独检查字符 - 不需要这样做。您可以直接使用 memcmp
检查它,然后输出结果。
关于c - 警告 : array subscript is above array bounds [-Warray-bounds] when compiling using -O3 flag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48890789/
在许多在线资源中,可以找到“内存”、“带宽”、“延迟”绑定(bind)内核的不同用法。在我看来,作者有时会使用他们自己对这些术语的定义,我认为这对某人做出明确区分非常有益。 据我了解:带宽绑定(bin
FIFO、LIFO 和LC Branch and Bound 有什么区别? 最佳答案 Branch & Bound 通过使用估计边界来限制可能解决方案的数量来发现完整搜索空间内的分支。不同的类型(FI
我有一个网页,其中有一些 Kendo 控件(例如下拉菜单和按钮)可以正常工作,但是添加Grid 会导致问题。 @(Html.Kendo().Grid(Model).Name("grid").Colu
术语“CPU 限制”和“I/O 限制”是什么意思? 最佳答案 这非常直观: 如果 CPU 更快,程序就会运行得更快,即程序的大部分时间只是使用 CPU(进行计算),则该程序是 CPU 密集型。 计算
我在以下代码段中遇到问题并发出警告,希望您能帮助我: fprintf (fp, "%dd%d+%d ", pMobIndex->mana[DICE_NUMBER], DICE_NUMBER 在我
swift 2 let gap = CGFloat(randomInRange(StackGapMinWidth...maxGap)) Missing argument label 'range:'
swift 2 let gap = CGFloat(randomInRange(StackGapMinWidth...maxGap)) Missing argument label 'range:'
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 6 年前。 这个问题是由于打字错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在
我想在gcc8.2下启用数组边界检查,这样可以帮助在编译期间检查数组下标是否越界,它可能会给出如下警告:数组下标高于数组边界 [-Warray-bounds] 我使用 coliru 做了一个演示: #
我只是想知道在 Apple API 中的什么地方定义了变量“bounds.minX”、“bounds.maxX”?我查看了“UIView”和“CGRect”文档,但似乎找不到它? 最佳答案 它包含在"
我想覆盖整个屏幕。我想将其框架设置为覆盖整个屏幕。浏览堆栈溢出时,我发现了这两种不同的设置 View 框架以覆盖屏幕的方法: [UIScreen mainScreen].bounds [UIApplc
在协程中执行 IO 绑定(bind)函数(例如,从后端请求数据)给了我一个优势,即在请求结果可用之前暂停它的执行,对吗?但是,受 CPU 限制的函数(例如,解析一个巨大的文本文件)不会“等待”任何东西
public class ChampionsLeague> extends League{ ... 如何创建此类的实例? ChampionsLeague league = new ChampionsL
我遇到了以下问题: 我有这些类和接口(interface)定义 public abstract class ViewModelRefreshPostListFragment> extends
我注意到在使用 (Swift 4.0) 的 IOS X 代码中,我至少可以通过以下两种方式请求 View 的高度 V: V.bounds.size.height 和... V.bounds.heigh
swift 中 bounds.size.width 和 bounds.width 有什么区别?他们会返回同样的东西吗?谢谢! 最佳答案 bounds 是 UIView 的 CGRect 结构属性,其中
在我看来不可能包含 Integer.MAX_VALUE和Long.MAX_VALUE创建 IntStream 时尽可能使用随机值或LongStream使用 java.util.Random 的边界类。
我有二叉树类: public class BinaryTree> extends AbstractTree { protected TreeNode root;
我最近做了并更新了我的 Xamarin iOS 项目,我曾经能够调用以下代码来检索屏幕宽度和高度: if (orientation == UIInterfaceOrientation.Landscap
我仍然不明白为什么我收到这个警告 array subscript is above array bounds [-Warray-bounds] 对于一个小的 C 代码如下: #include #in
我是一名优秀的程序员,十分优秀!