gpt4 book ai didi

c - 处理数组越界或负数组索引的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:17:45 26 4
gpt4 key购买 nike

我定义了一个映射到字符串数组的枚举。我将把这个字符串作为返回枚举值的函数的参数。该值用作另一个数组的索引。

函数看起来像这样

int get_unit_id(char * name);

如果在数组中找不到该名称,则函数返回 -1。虽然这种情况在当前设置中从未出现过,但静态分析工具会抛出一个错误,指出数组索引可以为负数。我该如何处理?

我也考虑过返回枚举的 MAX 元素的 ID,但这会导致数组越界警告

编辑:添加代码以供引用。检查函数的返回值是不可行的,因为函数是从很多地方调用的,这会增加很多 LOC 的数量。

int get_unit_id(const char * name)
{
int index;

for (index = 0; index < UNIT_MAX_UNITS; index++){
if(!strcmp(name, unit_map[index].unit_name)){
return unit_map[index].unit_id;
}
}
printf("Didn't find Unit %s, returning -1\n",name);
return -1;
}

最佳答案

如果您在将结果用作数组索引之前不费心检查结果是否为负数,静态分析工具会正确地标记可能使用负数索引。

如果你有一个特殊的数组元素作为一个未知名称的包罗万象并返回那个元素的索引而不是 -1,你可以绕过这个问题。

例如:

struct map {
char *unit_name;
int unit_id;
};

struct map unit_map[UNIT_MAX_UNITS+1] = {
{ "value_0", 0 },
{ "value_1", 1 },
...
{ "value_UNIT_MAX_UNITS-1", UNIT_MAX_UNITS-1 },
{ "unknown", UNIT_MAX_UNITS },
};

然后在你的函数中:

int get_unit_id(const char * name)
{
int index;

for (index = 0; index < UNIT_MAX_UNITS; index++){
if(!strcmp(name, unit_map[index].unit_name)){
return unit_map[index].unit_id;
}
}
printf("Didn't find Unit %s, returning UNIT_MAX_UNITS\n",name);
return unit_map[UNIT_MAX_UNITS].unit_id;
}

关于c - 处理数组越界或负数组索引的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49790384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com