标签: pc-lint

在第三方库的项目中使用PC-Lint

我有一个项目,其中包括一个大型的第三方库,我需要确保该项目不含棉绒.但是,该库有几千个错误.

修改库以删除这些不是一个选项 - 通常如何处理?

目前,代码是使用Keil uVision构建的,这是PC-Lint的调用方式,如果这仍然是最好的情况.

有没有办法指定这些是库文件,所以不应该分析?

谢谢.

c embedded pc-lint

6
推荐指数
1
解决办法
6707
查看次数

MISRA C 2012是否说不要使用bool

我正处于制定新项目的初期阶段.

我定义了一个返回类型为"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的解释是错误的还是他们发现了?

c c99 misra language-lawyer pc-lint

6
推荐指数
1
解决办法
3458
查看次数

PC Lint while(TRUE)vs for(;;)

我是第一次使用PC Lint.当PC Lint警告我我的时候,我正在"linting"我的代码while(TRUE).

这就是它所说的:

716:while(1)... - 找到形式的构造,而(1)......被找到.

虽然这表示期望布尔值的上下文中的常量,但它可以反映编程策略,其中无限循环以此构造为前缀.因此,它被赋予一个单独的数字,并被放入信息类别.更常规形式的无限循环前缀是(;;).

我不明白这个说法.任何人都可以帮我理解吗?

c embedded lint pc-lint

5
推荐指数
1
解决办法
1879
查看次数

PC Lint警告537:重复包含文件

如何从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 lint pc-lint

4
推荐指数
1
解决办法
6529
查看次数

使用直接寄存器寻址时出现PC-Lint错误

我有一个现有的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 embedded lint cpu-registers pc-lint

3
推荐指数
1
解决办法
1506
查看次数

双方都有副作用吗?

我使用以下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)

并从PC-lint报告中得到以下结论: 在此输入图像描述

有人可以解释第58和66行的代码如何遭受副作用,我该如何纠正?

c lint side-effects misra pc-lint

3
推荐指数
1
解决办法
1032
查看次数

如何抑制PC-Lint Note 970 for int main(void)函数?

我有一个带有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选项定义主函数来抑制此消息.

c c99 misra pc-lint ansi-c

3
推荐指数
1
解决办法
418
查看次数

函数指针和另一种类型之间的转换 [MISRA 2012 规则 11.1,需要] | pclint 9074

我使用如下的函数指针数组来避免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)

c misra pc-lint

3
推荐指数
1
解决办法
192
查看次数

Gimpel的PC-lint和Flexelint; 谁用过它们?

所以我已经阅读了一些杂志文章和Gimpel的PC-lint和Flexelint C/C++编译器的网站.

这真的很贵(至少对我而言),但似乎可能有一些保证成本的优点.

所以我想知道是否有其他人使用/购买过它们并且可以提供他们的意见?

compiler-construction static-analysis lint pc-lint

2
推荐指数
1
解决办法
3171
查看次数

如何在C中清除以下PC-Lint警告?

我对以下代码有疑问:

#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,如何解决?还是有其他方法可以绕过它,除了将常量变为变量?

c constants pc-lint

2
推荐指数
1
解决办法
1862
查看次数