Tag: 静态分析

有没有工具来测试c程序的简洁性?

例如,我想检查以下代码是否更简洁: for(i = 0; i size; i++){ if(0 bucket[i].n){ p = map->bucket[i].list; while(p){ h = hash(p->key) % n; if(bucket[h].list){ new_p = bucket[h].list; while(new_p->next)new_p = new_p->next; new_p->next = p; next = p->next; p->next = NULL; p = p->next; } else{ bucket[h].list = p; bucket[h].n++; next = p->next; p->next = NULL; p = p->next; } } } […]

在C宏中,应该更喜欢做{…}而(0,0)而不是{…}而(0)?

一位客户最近对我雇主的C代码库进行了静态分析,并向我们提供了结果。 在有用的补丁中,要求将着名的do { … } while(0)宏更改为do { … } while(0,0) 。 我理解他们的补丁正在做什么(使用序列运算符将evaluate 返回到第二个“0”的值,因此效果是相同的)但是不清楚他们为什么喜欢第二个表单而不是第一个表单。 有没有合理的理由为什么人们应该更喜欢第二种forms的宏观,还是我们客户的静态分析过于迂腐?

有害的C源文件检查?

有没有办法以编程方式检查单个C source file是否有潜在危害? 我知道没有检查会产生100%的准确性 – 但至少有兴趣做一些基本的检查,如果找到一些表达式/关键字会引起一个红旗。 有什么想法的想法? 注意:我要检查的文件大小相当小(最多几行),实现了所有在内存中运行的数值分析function。 代码中不得使用外部库(math.h除外)。 此外,不应使用I / O(函数将与内存数组一起运行)。 鉴于上述情况,我是否可以做一些程序性检查,至少尝试检测有害代码? 注意:因为我不期望任何I / O,如果代码执行I / O – 它被认为是有害的 。

堆栈大小估计

在multithreading嵌入式软件(用C或C ++编写)中,必须为线程提供足够的堆栈空间,以使其能够完成其操作而不会溢出。 在某些实时嵌入式环境中,正确调整堆栈大小至关重要,因为(至少在我使用过的某些系统中),操作系统不会为您检测到这一点。 通常,在创建线程时(即在pthread_create()等的参数中)指定新线程(除主线程之外)的堆栈大小。 通常,这些堆栈大小被硬编码为在最初编写或测试代码时已知良好的值。 但是,未来对代码的更改通常会破坏硬编码堆栈大小所依据的假设,并且在一个重要的日子里,您的线程进入其调用图的较深分支之一并溢出堆栈 – 从而导致整个系统崩溃或者默默地腐蚀记忆。 在线程中执行的代码在堆栈上声明struct实例的情况下,我个人已经看到了这个问题。 当结构体被扩充以容纳额外数据时,堆栈大小会相应地膨胀,从而可能发生堆栈溢出。 我想这对于已建立的代码库来说可能是一个巨大的问题,其中无法立即知道向结构添加字段的全部效果(太多的线程/函数来查找使用该结构的所有位置)。 由于对“堆栈大小”问题的通常响应是“它们不可移植”,因此我们假设编译器,操作系统和处理器都是此调查的已知数量。 我们也假设没有使用递归,所以我们没有处理“无限递归”场景的可能性。 有哪些可靠的方法可以估算线程所需的堆栈大小? 我更喜欢离线(静态分析)和自动方法,但欢迎所有想法。

头文件包含静态分析工具?

一位同事最近向我透露,我们的一个源文件在编译期间包含了超过3,400个标题。 我们有超过1,000个翻译单元可以在构建中进行编译,从而导致对标题的巨大性能损失,这些标题肯定不会全部使用。 是否有任何静态分析工具可以揭示这样一片森林中的树木,特别是让我们能够决定我们应该在哪些方面进行削减? UPDATE 在这里找到了一些关于包含头文件(以及优化其包含的包含保护类型)的成本的一些有趣信息,源于这个问题 。

为清晰起见,是否应使用返回类型的无用类型限定符?

当我们在头文件中有原型时,我们的静态分析工具会抱怨“返回类型上无用的类型限定符”,例如: const int foo(); 我们这样定义它是因为函数返回一个永远不会改变的常量,认为API似乎更清晰。 我觉得这类似于为了清楚明确地将全局变量初始化为零,即使C标准已经声明如果未明确初始化所有全局变量将被初始化为零。 在一天结束时,它真的没关系。 (但静态分析工具并没有抱怨。) 我的问题是,有什么理由可以导致问题吗? 我们是否应该忽略该工具产生的错误,或者我们是否应该以不太清晰和一致的API的可能成本来安抚该工具? (它返回该工具没有问题的其他const char*常量。)