问题标签 [splint]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
789 浏览

c - Splint 静态分析器:找不到 splint.rc 配置文件 (Windows)

根据夹板常见问题解答

对于 Win32,由于 DOS 文件名限制,Splint 会查找 splint.rc 而不是 .splintrc。它将首先在当前目录中查找,然后在您的主目录中查找。

我设置了一个非常简单的测试来尝试让 Splint 工作:

  • 第 1 步:提取splint-3.1.1.win32.zipc:\splint
  • 第2步:输入c:\test\test.c一个简单的程序:

    无效的主要(无效){}

  • 第三步:运行“cmd”

  • 第四步:输入命令:cd c:\test\

然后我尝试使用夹板,没有夹板.rc,没有标志

  • 第 5 步:输入命令 `c:\splint\bin\splint.exe test.c'

正如预期的那样,这会产生输出The function main does not output the expected type

然后我尝试使用夹板,没有夹板.rc,和 -maintype 标志

  • 第 5 步:输入命令 `c:\splint\bin\splint.exe test.c -maintype'

正如预期的那样,输出不再产生The function main does not output the expected type.

然后我尝试使用带有 splint.rc 的夹板,其中包含 -maintype 标志

  • 第5步:在c:\test\splint.rc我把内容-maintype
  • 第 5 步:输入命令 `c:\splint\bin\splint.exe test.c'

因为我输入-maintypesplint.rc,并且因为我正在从其中包含的目录中运行 splint 命令,splint.rc所以 splint 不应该出现关于 main 函数的警告,但它确实出现了。我猜夹板没有拿起 splint.rc 配置文件。

我究竟做错了什么?谢谢

0 投票
2 回答
861 浏览

c - 非标准函数返回类型:修复 Splint 解析错误

我正在使用嵌入式系统 XC8 C 编译器(用于 PIC 微处理器)。以下是允许的:

但作为非标准 C,Splint 静态分析器会给出以下错误:

解析错误:非函数声明:位:“--------------------------”诠释。

错误的文件/行是相应 .h 文件中的函数原型。

我该如何解决这个问题,以便 Splint 可以分析其余文件?我认为可能有两种方法:

  1. 我想我记得看到一个可以通过 CLI 传递给 Splint 的标志,它告诉它将给定的非标准类型替换为标准类型(例如位到无符号字符),但我现在似乎根本找不到它!

  2. 此外,也许还有另一种方法可以编写满足 ANSI-C 要求的 c 代码,同时仍然允许 XC8 将返回类型解释为bit?

进步:

我在论坛上找到了以下内容,但在手册中找不到有关如何使用 -D 标志的信息

要忽略关键字,请添加 -Dnonstandardkeyword= 以使预处理器将其消除

使用 -Dspecialtype=int 将自定义类型解析为 int。

0 投票
1 回答
69 浏览

c - Splint:用 `unsigned char` 替换非标准类型 `bit`

(这是我上一个问题的扩展)。我在 Windows CLI 中使用 Splint。

XC8 嵌入式 C 编译器有一个自定义类型bit。为了让 Splint 解析,我可以将 CLI 选项传递给它:

但是我需要将其替换bitunsigned char. 空格字符是个问题。如何修改上述标志?

0 投票
2 回答
1391 浏览

c - C:夹板指针相关的警告。他们是什么意思?

以下代码编译并执行,没有任何警告或错误。但是,当我使用夹板分析代码时,它显示 4 个警告(显示在代码下方)。

我见过的大多数示例(带有那种警告)都使用 malloc 和 free。由于此代码不使用 malloc,我们可以说忽略这些警告是安全的吗?在不删除指针的情况下编写代码的正确方法应该是什么?

(1) :28:5: 仅隐式存储 w->o (type obj *) 未在分配前释放: w->o = &pc 。检测到内存泄漏。只有限定的存储在最后一次引用丢失之前不会被释放。

(1) :28:5: 直接地址 &pc 仅隐式分配给: w->o = &pc 。立即地址(& 运算符的结果)传输不一致。

(2) :33:11: 定义前使用的变量 w 使用的右值可能未初始化为某个执行路径上的值。

(3) :34:14: 只有从这个范围内声明的变量派生的存储 wo(类型 obj *)不会被释放(内存泄漏)。怀疑由于结构或深度指针的不完全释放导致的存储泄漏。可从正在解除分配的引用访问的非共享存储尚未被解除分配。Splint 假设当一个对象作为仅输出的 void 指针传递时,外部对象将被释放,但内部对象不会。

这段代码只是对我想要实现的其他东西的测试,但由于我不精通 C,我想了解使用上述方法的内存泄漏风险。

提前致谢。

0 投票
1 回答
538 浏览

c - 适用于 Windows 的示例夹板选项文件

我正在尝试使夹板与我正在处理的嵌入式项目一起工作。我想知道是否有一个示例.splintrc选项文件,我可以在其中添加自己的选项/配置以简化整个过程。我正在使用 IAR 工作台来编译和构建项目,并希望将夹板与 IDE 集成。

0 投票
1 回答
9484 浏览

c - 在 C 程序中跟踪数组越界访问/写入的推荐方法

考虑用 C 编写一些不太明显的算法的实现。例如,让它成为递归快速排序,我在 KN King 的“C Programming: A Modern Approach, 2nd Edition”一书中找到了它,可以从这里获得。最有趣的部分包括以下两个定义:

两个while循环都可以通过删除low < high测试来优化:

确保每次访问或写入数组(在堆栈上分配)实际上是有效的(即不会引发未定义的行为)的推荐方法是什么?我已经尝试过的是:

  • 手动调试gdb一些实际数据
  • 将源代码传递给静态分析工具,例如splitcppcheck
  • valgrind--tool=exp-sgcheck开关

例如有五个元素数组{8, 1, 2, 3, 4}

结果是(当然它依赖于实现):

1. GDB

如您所见,low变量超出了边界:

2.静态分析工具

3. Valgrind 与--tool=exp-sgcheck

该位置at 0x4005A0: split (qsort.c:46)与我gdb手动找到的位置匹配。

0 投票
1 回答
447 浏览

mysql - Splint 和 MySQL:空存储作为非空参数传递

我正在尝试将 Splint 与简短的 CGI 脚本一起使用,但出现此错误:

Null storage passed as non-null param: mysql_init(NULL)

mysql_init被定义为返回一个新值,如果它的参数是NULL,或者如果不是,则将结果存储在参数中。然而,如果我尝试

我会得到:

Variable connection used before definition

如何解决这个问题?一种方法当然是注释mysql.h,这样 Splint 就不会抱怨。是我唯一的解决方案吗?

0 投票
1 回答
152 浏览

mysql - Splint 不知道库函数正在释放内存

在 C 中使用 MySQL 时,您可以使用 MySQL API 释放内存,如下所示:

但是 Splint 不知道这mysql_close实际上是在释放内存,所以我收到了这个错误:

我如何告诉 Splintmysql_close正在释放内存?文件的特殊注释mysql.h

编辑:好的,也许是releases *p注释,如果可以在头文件中使用的话。会尝试。

编辑 2:添加/*@releases *sock@*/mysql.h,但现在出现此错误:

这是 的签名mysql_close

0 投票
1 回答
204 浏览

mysql - 带有 Splint 的 MySQL C API:释放字段和行

我正在尝试将Splint与 MySQL C API 一起使用,并且遇到了一些与释放内存有关的其他问题。在我能找到的所有关于使用 C API 的示例中,唯一被调用的释放函数是mysql_free_result,但行和字段永远不会被释放:

Splint 当然会抛出一个错误,指出行和字段是内存泄漏。他们是吗?如何解决这个问题?我应该手动释放行和字段结构吗?

编辑:好的,因为mysql_fetch_row当没有更多的行时返回 null,我假设它也会从每个循环的前一行中释放所有内存。但我怎么会告诉斯普林特这件事呢?

编辑2:这是mysql_fetch_row(5.5版)的实现。没有分配内存,该函数只是将您指向下一行。因此,需要一个 Splint 注释来告诉 Splint 没有分配内存,而是共享内存。

0 投票
2 回答
458 浏览

c - 夹板:“定义前使用的值字符串 []”与动态数组

我在 C 中使用动态字符串数组:

我初始化它:

并复制几个虚拟字符串:

然而,当我尝试打印这个时:

我从 Splint 收到此错误:

像这样检查NULL无济于事:

因为strings[i]仍然在“定义之前”使用。

关于如何解决这个问题的任何想法?

编辑:我想,我会用链表来试试这个。

另外,完整的代码清单: