Lint 可能访问/创建越界指针

Lint possible access / creation out of bounds pointer

我收到 Lint 警告 661 / 662。它们表示可能访问/创建越界指针。但是我确实检查了边界,并且不可能越界。任何想法如何摆脱它?

const my_enum_type my_array[] = {MY_FIRST_ENUM_VALUE, MY_SECOND_ENUM_VALUE, MY_THIRD_ENUM_VALUE};  
for(i = 0; i < sizeof(my_array); i++){ 
    //do stuff such as
    my_variable = my_array[i];
    my_function(my_array[i]);
}  

我使用 my_array[i] 的行抱怨代码 661 / 662。

sizeof(my_array) 不是你想要的。你想要 sizeof(my_array) / sizeof(*my_array).

您可以使用迭代器:

for(auto it = std::begin(my_array); it != std::end(my_array); ++it){ 
    //do stuff such as
    my_variable = *it;
    my_function(*it);
}

或直接针对范围:

for (const auto& e : my_array){ 
    //do stuff such as
    my_variable = e;
    my_function(e);
}

sizeof returns 字节数,而不是元素数,所以我猜错误是有效的。 使用 sizeof(my_array) / sizeof(my_array[0]) 获取元素计数。

sizeof(myarray) returns 对象表示的字节大小。所以不是数组中的项目数,而是整个数组的大小。如果sizeof(my_enum_type) > 1 i会出界

尝试sizeof(myarray) / sizeof(my_enum_type)

sizeof(my_array) 不是 return 数组中元素的数量,它 return 是数组的字节大小。

获取大小的传统 C 方法是 sizeof(my_array) / sizeof(my_array[0]) 但更安全的 C++11 方法是使用 std::extent from <type_traits>:

std::extent<decltype(my_array)>::value