【问题标题】:Using PC-Lint on project with third party libraries在带有第三方库的项目上使用 PC-Lint
【发布时间】:2013-05-26 21:12:16
【问题描述】:

我有一个项目,其中包含一个大型第三方库,并且需要确保该项目不含 lint。但是,该库有数千个错误。

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

目前,代码是使用 Keil uVision 构建的,这是调用 PC-Lint 的地方,因此如果仍然是这种情况,那将是最好的。

有没有办法指定这些是库文件,因此不应分析?

谢谢。

【问题讨论】:

  • 所以您正在寻找一种完全跳过对一组源文件进行 linting 的方法? (您的库不是预编译的目标文件,您是从源代码编译的吗?)如果您完全跳过这些文件,您可能会在全局总结期间出现“未定义函数”类型错误...
  • 没错。这就是为什么我不只是从 LINT 命令中排除这些文件。是否可以为此目的包括它们,同时也表明它们的错误应该被忽略?

标签: c embedded pc-lint


【解决方案1】:

这是来自 Gimpel 网站的信息,我相信它涵盖了您正在寻找的选项(加粗以强调):

Lint 使用“库”标头的标签来指定程序员无法控制的那些标头(例如编译器标头)。默认情况下,来自外部目录或包含在 中的所有#include 都被视为“库”。 这可以通过使用 +libclass 选项进行修改,并使用 +/-libdir 和 +/-libh 选项进一步微调。然后,您可以使用 -wlib 、 -elib 和 -elibsym 选项来控制那些从库头发出的消息。 与 PC-lint 一起分发的编译器选项文件通常包含一个 -wlib(1) 选项,它限制 lint 输出仅从库标题到错误(抑制警告和信息性消息)。

您可以在 Gimpel 网站here 找到更多信息。

另外,如果我没记错的话,-wlib(0) 会抑制所有库错误和警告...与上面提到的 -wlib(1) 不同。当我回到工作岗位时,我将不得不仔细检查。我没有手册的副本。

---编辑---

如果是一个选项,我会将与库关联的所有文件放在不同的目录中。在 Keil 中,您可以转到“工具->设置 PC-Lint”。然后将新目录添加到“PC-Lint 包含文件夹”列表中。然后,您的 -wlib(0) 选项应将这些标头视为“外部”并且不返回错误。当然,您还必须修改项目设置以编译库文件。

---EDIT2 添加示例---

好的,这是我试图确保我的建议可行的一个小测试。我在名为“ex_lib”的目录中创建了一个项目,并将项目命名为 lib_test。在“Source Group 1”中,我创建并添加了文件“main.c”:

ma​​in.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);
}

library 项目中,在“Options for Target 'Target 1'”下,我选择了“Create Library”。然后我编译了 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 警告,但我预料到了。

【讨论】:

  • 我确实看到并尝试过 - 但据我所知,它仅适用于头文件 - 这是错误的吗?
  • 我认为关键是确保您的第三方库文件位于“外部”目录中 - 然后其头文件的所有#includes 都会引用该目录。根据您的项目大小,这可能有点过于繁琐,但这是一种选择。
  • 哇,感谢您的详细回复!我已经在一个专用目录中拥有所有库文件。分离成两个项目并使用库文件可以工作,但这会破坏“Go To Definition Of ..”功能,这是一种耻辱。我对完全跳过文件的担忧是,我相信完整的项目分析是最好的(既可与 ALOA 一起使用,又可避免“功能未定义”错误 - 所以总而言之,我想将所有内容放在一起,以便 Keil 功能是没有损坏,但表明某些文件可能包含错误。这可能吗?
  • 添加:在-wlib(0)之后使用-e686选项来消除警告:选项'wlib(0)'是可疑的,因为...
  • @Borzh 我发现我需要使用 -e686 before -wlib(0) 来抑制错误消息。我在 .lnt 文件中有 -wlib(0),所以我需要将 -e686 放在 .lnt 文件的顶部,或者在传递 .lnt 文件之前放在命令行上。将 -e686 添加到第一个之后列出的第二个 .lnt 文件不起作用。谢谢你的领导!我用它来避免 686 弄乱我提供给 SonarQube 的 XML 输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
相关资源
最近更新 更多