我有一个项目,其中包括一个大型的第三方库,我需要确保该项目不含棉绒.但是,该库有几千个错误.
修改库以删除这些不是一个选项 - 通常如何处理?
目前,代码是使用Keil uVision构建的,这是PC-Lint的调用方式,如果这仍然是最好的情况.
有没有办法指定这些是库文件,所以不应该分析?
谢谢.
我正处于制定新项目的初期阶段.
我定义了一个返回类型为"bool"的函数
我从PC-Lint得到了这个输出
Including file sockets.h (hdr)
bool sock_close(uint8_t socket_id);
^
"LINT: sockets.h (52, 1) Note 970: Use of modifier or type '_Bool' outside of a typedef [MISRA 2012 Directive 4.6, advisory]"
Run Code Online (Sandbox Code Playgroud)
我继续在另一个标题中定义了这个以关闭lint:
typedef bool bool_t;
Run Code Online (Sandbox Code Playgroud)
然后我开始想知道为什么我必须这样做以及为什么它改变了什么.我转向MISRA 2012 Dir 4.6.它主要关注基本类型的宽度,如short,int和long,它们的宽度以及它们的签名方式.
该标准没有给出任何放大,合理,例外或bool的例子.
bool在C99中的stdbool.h中明确定义为_Bool.那么这个标准真的适用于bool吗?
根据C99的第6.2.5节,我认为_Bool明确地始终是"最小的标准无符号整数类型,足以存储值0和1".所以我们知道bool是无符号的.那么问题就在于_Bool不是固定的宽度而且主题被提升的某种方式是问题吗?因为理性似乎与这个概念相矛盾.
遵守本指南并不保证可移植性,因为int类型的大小可能决定表达式是否受整数提升的影响.
如何typedef bool bool_t;改变任何东西 - 因为我没有做任何表示这样做的宽度或标记?bool_t的宽度也将取决于平台.有没有更好的方法重新定义布尔?
除非实现的类型实际上具有该长度,否则不能使用特定长度定义类型
所以typedef bool bool8_t;应该完全违法.
Gimpel对指令4.6的解释是错误的还是他们发现了?
我是第一次使用PC Lint.当PC Lint警告我我的时候,我正在"linting"我的代码while(TRUE).
这就是它所说的:
716:while(1)... - 找到形式的构造,而(1)......被找到.
虽然这表示期望布尔值的上下文中的常量,但它可以反映编程策略,其中无限循环以此构造为前缀.因此,它被赋予一个单独的数字,并被放入信息类别.更常规形式的无限循环前缀是(;;).
我不明白这个说法.任何人都可以帮我理解吗?
如何从PC Lint处理此警告?
我有几个文件#include <GenericTypeDefs.h>.PC Lint向我显示消息Warning 537: Repeated include file 'filepath\filename.h'如果我删除此声明我无法编译.
如果可能的话,我想取消这个警告.
你可以在这里看到同样的报道.
这是我的代码,我的编译器发出警告:
checksum.h
#ifndef CHECKSUM_H
#define CHECKSUM_H
#include <GenericTypeDefs.h>
BOOL isCheckSumCorrect(const UINT8 *dataPointer, UINT8 len, UINT8 checkSumByte);
#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)
cryptography.h
#ifndef CRYPTOGRAPHY_H
#define CRYPTOGRAPHY_H
#include <GenericTypeDefs.h>
UINT8 encrypt(UINT8 c);
UINT8 decrypt(UINT8 c);
#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)
crc8.h
#ifndef CRC_H
#define CRC_H
#include <GenericTypeDefs.h>
UINT8 generateCRC(const UINT8 *ptr, UINT8 Len);
BOOL isCRCValid(const UINT8 *ptr, UINT8 Len, UINT8 CRCChar); …Run Code Online (Sandbox Code Playgroud) 我有一个现有的C代码(第三方来源,我无法改变它),PC-Lint(版本9.0)不接受它.代码在嵌入式环境中运行,使用Green Hills Compiler.
有谁知道如何配置PC-Lint接受代码定义?我只附加了struct中第一个成员的错误消息.
以下是头文件的定义:
typedef struct
{
uint32_t PINSEL0; // see ERROR message from PCLint, line 153 in LPC23.h
uint32_t PINSEL1;
uint32_t PINSEL2;
} LPC_PINCON_TypeDef;
#define LPC_PINCON_BASE (0xE002C000)
#define LPC_PINCON ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE)
#define PINSEL_BASE_ADDR 0xE002C000
#define PINSEL0 (*(volatile unsigned long *)(PINSEL_BASE_ADDR + 0x00))
/**************************/
/* function in c-file */
void Port_Init()
{
LPC_PINCON->PINSEL0 &= ~(3 << 4); //p0.2
LPC_PINCON->PINSEL0 |= (1 << 4); //
LPC_PINCON->PINSEL0 &= ~(3 << 6); //p0.3
LPC_PINCON->PINSEL0 |= (1 << 6); //
// etc................ …Run Code Online (Sandbox Code Playgroud) 我使用以下C代码对MISRA 2004和MISRA 2012运行静态代码分析:
BOOL_TYPE Strings_Are_Equal(const char *s1, const char *s2)
{
BOOL_TYPE result = True;
const char *str1 = s1;
const char *str2 = s2;
if (NULL == s1 || NULL == s2)
{
result = False;
}
else if (strlen(s1) != strlen(s2))
{
result = False;
}
else
{
while (*str1 != 0)
{
if(tolower(*str1++) != tolower(*str2++))
{
result = False;
break;
}
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释第58和66行的代码如何遭受副作用,我该如何纠正?
我有一个带有ANSI C代码的Visual Studio Windows控制台应用程序.在主函数的定义是这样的:
int main(void)
{
// do stuff
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,PC-Lint报告int类型的以下消息
注释970:在typedef之外使用修饰符或类型 [MISRA 2012 Directive 4.6,advisory]
我需要保留main函数和Note 970的int类型.因此,我想仅针对主函数定义来抑制Note 970.我不想在源代码上添加// lint!e970.
我想知道是否可以仅使用PC-Lint选项定义主函数来抑制此消息.
我使用如下的函数指针数组来避免switch代码中的语句。
void E_func1(void);
void E_func2(void);
void E_func3(void);
void (*pfGetVal[3])() = {
E_func1,
E_func2,
E_func3
};
Run Code Online (Sandbox Code Playgroud)
但是在运行 misra (pclint) 时,我收到以下错误:
函数指针和另一种类型之间的转换 [MISRA 2012 规则 11.1,需要]
我需要使用typedef吗?
我尝试如下,但没有奏效。
void (*pfGetVal[3])();
pfGetVal[0] = E_func1;
pfGetVal[1] = E_func2;
pfGetVal[2] = E_func3;
Run Code Online (Sandbox Code Playgroud) 所以我已经阅读了一些杂志文章和Gimpel的PC-lint和Flexelint C/C++编译器的网站.
这真的很贵(至少对我而言),但似乎可能有一些保证成本的优点.
所以我想知道是否有其他人使用/购买过它们并且可以提供他们的意见?
我对以下代码有疑问:
#define NUM_DAYS 60
#define NUM_PEOPLE 30
int days[NUM_DAYS];
int people[NUM_PEOPLE];
int size;
size = sizeof(day) > sizeof(people) ? sizeof(day) : sizeof(people);
Run Code Online (Sandbox Code Playgroud)
虽然可以将宏NUM_PEOPLE更改为大于NUM_DAYS或小于NUM_DAYS,但我收到警告:
Warning 506: Constant value Boolean,如何解决?还是有其他方法可以绕过它,除了将常量变为变量?