我有一个项目,其中包括一个大型第三方库,并且需要确保该项目没有 lint-free。但是,该库有数千个错误。
修改库以删除这些不是一种选择 - 通常如何处理?
目前,代码是使用 Keil uVision 构建的,这是调用 PC-Lint 的地方,所以如果仍然是这种情况,那将是最好的。
有没有办法指定这些是库文件,因此不应分析?
谢谢。
这是来自 Gimpel 网站的信息,我相信它涵盖了您正在寻找的选项(加粗以强调):
Lint 使用“库”标头的标签来指定程序员无法控制的那些标头(例如编译器标头)。默认情况下,来自外部目录或包含在 < > 中的所有#include 都被视为“库”。 这可以通过使用 +libclass 选项进行修改,并使用 +/-libdir 和 +/-libh 选项进一步微调。然后,您可以使用 -wlib 、 -elib 和 -elibsym 选项来控制仅从库头发出的那些消息。 与 PC-lint 一起分发的编译器选项文件通常包含一个 -wlib(1) 选项,该选项将来自库头的 lint 输出限制为仅错误(抑制警告和信息性消息)。
您可以在此处的 Gimpel 网站上找到更多信息。
另外,如果我没记错的话, -wlib(0) 会抑制所有库错误和警告......与上面提到的 -wlib(1) 不同。当我回到工作岗位时,我将不得不仔细检查。我没有手册的副本。
- -编辑 - -
如果它是一个选项,我会将与该库关联的所有文件放在不同的目录中。在 Keil 中,您可以转到“工具->设置 PC-Lint”。然后将新目录添加到“PC-Lint 包含文件夹”列表中。然后,您的 -wlib(0) 选项应将这些标头视为“外部”并且不返回错误。当然,您还必须修改项目设置以编译库文件。
---EDIT2添加示例---
好的,这是我试图确保我的建议可行的一个小测试。我在名为“ex_lib”的目录中创建了一个项目,并将项目命名为lib_test。在“Source Group 1”中,我创建并添加了文件“main.c”:
主程序
#include <lib_test.h>
int main (void)
{
uint16_t x = 5;
uint16_t y = 10;
uint16_t total1 = 0;
uint16_t total2 = 0;
uint16_t total3 = 0;
uint16_t total4 = 0;
total1 = add(x,y);
total2 = sub(x,y);
total3 = mult(x,y);
total4 = div(x,y);
return 0;
}
然后,我创建了一个名为“library”的子目录,并在该目录中创建了第二个名为library的项目。库项目由以下文件“lib_test.h”和“lib_test.c”组成。
lib_test.h
#ifndef LIB_TEST__
#define LIB_TEST__
#include <stdint.h>
extern uint16_t add(uint16_t x, uint16_t y);
extern uint16_t sub(uint16_t x, uint16_t y);
extern uint16_t mult(uint16_t x, uint16_t y);
extern uint16_t div(uint16_t x, uint16_t y);
#endif /* LIB_TEST__ */
lib_test.c
#include "lib_test.h"
uint16_t add(uint16_t x, uint16_t y)
{
return (x + y);
}
uint16_t sub(uint16_t x, uint16_t y)
{
return (x - y);
}
uint16_t mult(uint16_t x, uint16_t y)
{
return (x * y);
}
uint16_t div(uint16_t x, uint16_t y)
{
return (x / y);
}
在库项目中,在“Target 'Target 1'的选项”下,我选择了“Create Library”。然后我编译了库项目。
编译成功后,我回到lib_test项目,右键“Target1”,选择“Add Group”。我创建了一个名为“Library”的组,并将之前编译的“library.lib”从“library”目录添加到“Library”组中。
最后,在 Target 1 的选项下(在lib_test项目中),我转到“C/C++”选项卡并将“库”添加到“包含路径”中。然后,我能够成功编译lib_test项目(带有一些关于已设置但从未使用过的变量的警告)。在“工具->设置 PC-Lint”下,我添加了以下内容:
PC-Lint 包含文件夹:C:\Keil_ARM\RV31\INC\ 和 library\
Lint 可执行文件:C:\Lint\LINT-NT.EXE
配置文件:C:\Lint\lnt\CO-RV.LNT
我修改了 CO-RV.LNT 文件以通过修改 -wlib() 来验证我的 Lint 结果。当我使用 -wlib(0) 运行 Lint 时,我没有收到关于我的库文件的警告或错误。然后我更改了 -wlib(2) 并收到了许多关于 stdint.h 的警告。
这绝对是一个过度简化,但它应该给你一个很好的起点。此外,我收到了关于我的变量没有在“main.c”中访问的 Lint 警告,但我预料到了这一点。