我希望在Linux下生成一个完整的夹板报告文件,包括日期和拆分工具版本。我尝试使用">“将stdio拆分输出重定向到一个文件,但在文件中,我发现只有拆分的消息才能更好地解释,我在main.c上运行splint,在stdio上运行以下消息:
**Splint 3.1.2 --- 20 Feb 2018
main.c: (in function main)
main.c:7:8: Variable c declared but not used
A variable is declared but never used. Use /*@unused@*/ in front of
de
在这段代码中(整个文件只包含一行):
char buffer[256] = { 0 };
用夹板检查,我得到了以下提示:
foo.c(1,20): Initializer block for buffer has 1 element, but declared as char
[256]: 0
Initializer does not define all elements of a declared array. (Use
-initallelements to inhibit warning)
初始化器没有定义声明数组的所有元素。--这是令人费解的:
适用于下列方案:
int main(void)
{
int value = 2;
int result = value >> 1U;
return result;
}
...Splint 3.1.2发出警告:
splint_test.c: (in function main)
splint_test.c:4:18: Variable result initialized to type unsigned int, expects
int: value >> 1U
To ignore signs i
我正在尝试使用非常长的选项文本显示Sencha Touch2 selectfield,但文本会被省略号截断,如Very long option t...。
如何在一个选项中显示成对的行?
代码:
{
xtype: 'selectfield',
options:[
{
text: 'Very long option I wish to splint into two separate lines',
value: 0
},
{
text: 'Another very long option
我想使用Splint来检测具有相同底层类型的typedef之间的隐式强制转换,如以下代码所示:
typedef int counter;
typedef int delta;
static int func(int a, int b, int c)
{
return a + b + c;
}
int main(void)
{
int a = 5;
counter b = a;
delta c = (int) 8;
return func(a, b, c);
}
看起来我可以使用来做这件事,但是它不会产生任何警告。即使将两个typedef都注释为abs
有没有工具(最好是在linux上)可以在参数被定义为比原型指定的更小的数组时发出警告?
例如:
void somefunc(float arg[10]); /* normally this would be defined in a header */
void my_func(void)
{
float arg[2];
somefunc(arg); /* <-- this could be a warning */
}
我意识到这不是无效代码,但如果可以警告它,它可以解决一些常见的错误(最近遇到了这些错误之一)。
一些工具(例如clang static check
我在一段C代码上运行splint,它给了我以下语句:
jmptable.c:34:5: Implicitly only storage vm->jumptable (type struct
jumptable_entry **) not released before assignment:
vm->jumptable = (struct jumptable_entry **)calloc(vm->jumptable_size + 1,
sizeof(struct jumptable_entry *))
A memory leak has
我正在为gcc搜索编译器标志,如果可能的话,还会为clang和Microsoft编译器搜索一个警告(使用-Werror时出错),如果调用一个非空函数而不使用如下的返回值:
int test() {
return 4;
}
int main(void) {
test(); //should trigger a warning
int number = test(); //shouldn't trigger the warning
return 0;
}
如果没有这样的编译器标志,也许可以通过某种方式让clang静态分析器抱怨它。
编辑:来澄清我最初的问题
Splint给了我以下警告:
encrypt.c:4:8: Function exported but not used outside encrypt: flip
A declaration is exported, but not used outside this module. Declaration can
use static qualifier. (Use -exportlocal to inhibit warning)
encrypt.c:10:1: Definition of flip
因为我只在这个文件上调用了splint,它是怎么知道的?
#include
我不知道为什么突然间我的gprbuild被卡住了。以下是一种非常简单的复制我所看到的东西的方法:
mkdir test
mkdir build
printf 'with Ada.Text_IO; use Ada.Text_IO;\nprocedure Main is begin Put_Line ("Hello, World!"); end Main;' > test/main.adb
printf 'project Test is\n for Source_Dirs use ("test");\n for Object
在链接之前,是否有方法检查头文件中的所有函数是否都实现了?
示例:
example.h
#include<stdio.h>
int function1(void);
int function2(void);
int function3(void);
example.c
#include "example.h"
int function1(void)
{
printf("Hi. I am function 1\n");
return 0;
}
我在寻找在编译时返回一个警告的东西,比如"function2和function3没
此代码在ANSI-C中似乎不正确,但在C99中可以:
struct a { int x; int y; } z;
C99和ANSI-C中的结构有什么不同?
编辑:我忘记了"a",这是我的错。这段代码在C99模式下可以用gcc编译,但在splint上是一个解析错误,众所周知,splint并不支持所有的C99扩展。
Edit2:以下是splint的输出:
Splint 3.1.2 --- 19 Dec 2007
build/ecos_install/include/cyg/fileio/fileio.h:151:5:
Parse Error. Attempting to cont
尝试运行这段代码:
void print_matrix(matrix* arg)
{
int i, j;
for(i = 0; i < arg->rows; i++) {
for(j = 0; j < arg->columns; j++) { // gdb shows, that arg->columns value
printf("\n %f", arg->data[i][j]); // has been changed in this line
下面的代码似乎编译得很好。
typedef struct Test {
int i;
int j;
} Test;
int main() {
int i;
i = 0;
Test p = {i, 1};
printf("%d\n", p.i);
return 0;
}
夹板
example2.c:9:7: Parse Error. (For help on parse errors, see splint -help
parseerrors.
(这是Test p = {i, 1};行)
这是非法的C,还是夹板中的错误?
(我想