如何解决这个符合MISRA C 的警告
How to resolve this MISRA c++ compliant warning
int foo(const uint8_t array[]) {
int x;
for(i=0;i<5;i++){
x= array[i];
}
return 0;
}
它给出以下警告,
"参数数组可以声明const" ==>我已经声明了数组const,我正在c 中编程。
要注意的第一件事是 int foo(const uint8_t array[])
等于int foo(const uint8_t* array)
,即该函数将指针用于const uint8_t
,而不是数组。指针本身不是 const
,尖端是。签名应为:
int foo(const uint8_t* const array)
在记录中,我认为此警告没有特别有用。该参数是按值采集的,呼叫者不太在乎该函数对其的作用。此外,比较函数签名时忽略了参数的最高级别const限定符,这可能会导致一些混乱。
例如, void foo(int)
和 void foo(const int)
是相同的签名。
编辑:
因此,根据您的评论,Misra不知道您不能以价值传递数组,并且抱怨阵列索引的作用与指针算术不同。 shudder ... 问题是您无法使用数组语法添加顶级const
,这可以解决这两个警告互斥。
尝试这样欺骗它,然后:
typedef const uint8_t Array[];
int foo(const Array arr);
int foo(const uint8_t * array)
因此, array
指向一个常数字节的数组;但本身并不恒定。警告指出,由于该函数不会修改指针,因此它可以(至少根据此规则,应该)是恒定的:
int foo(const uint8_t * const array)
有另一种方法,似乎在<iterator>
要向前移动指针'安全'您只需使用 std::advance(array, 1)
,然后即可访问该值,您只需取消 (*array)
,位置,这似乎可以摆脱有问题的Misra警告。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- c++:需要正确的语法以避免 MISRA 14-6-1 警告.具有依赖基类的类模板
- MISRA 警告<复杂表达式隐式转换为不同的基本类型>
- 如何解决此MISRA警告:C
- Misra C 2008奇怪的警告
- 如何解决这个符合MISRA C 的警告
- 警告634和警告613:Misra