是的,有编程方法可以检测你关心的条件。
在我看来,你最好使用静态分析工具来验证代码的预处理版本是否:
1. 不调用除自身定义和标准库中的非 I/O 函数之外的任何函数,
2. 不对指针进行任何不良操作。
通过预处理,您可以消除检测宏、可能存在的坏宏内容以及实际使用宏的问题。此外,您不想浏览所有标准 C 标头中的宏定义;它们会因为包含所有历史垃圾而伤害您的灵魂。
如果代码只调用自己的函数和标准库中可信赖的函数,则不会调用任何不良操作。(注意:它可能通过指针调用某些函数,因此此检查需要函数指向分析或同意间接函数调用是被禁止的,这实际上对于执行数值分析的代码来说可能是合理的)。
检查指针是否存在不良操作的目的是为了防止滥用指针制造不良代码并将控制权传递给它。这首先意味着“不要从 int 强制转换为指针”,因为您不知道 int 来自哪里 :-}。
对于who-does-it-call检查,您需要解析代码并解析每个符号的名称/类型,然后检查调用站点以确定它们去哪里。如果允许使用指针/函数指针,则需要进行完整的指向分析。
标准静态分析器工具公司(Coverity、Klocwork)中的一个可能提供某种限制代码块可以调用哪些函数的方法。如果这不起作用,您将不得不退回到更通用的分析机器上,例如我们的
DMS软件重工具包及其
C前端。DMS提供了可定制的机器来构建任意静态分析器,对于作为前端提供给它的语言描述。DMS可以配置为执行测试1)(包括预处理步骤);它还具有完整的指向和函数指向分析器,可用于指向检查。
对于2)“不恶意使用指针”,标准的静态分析工具公司提供了一些指针检查。然而,这里他们面临着一个更困难的问题,因为他们正在静态地尝试推理一个图灵机。他们的解决方案要么是错过案例,要么是报告错误的结果。我们的
CheckPointer工具是一种
动态分析,也就是说,它会在代码运行时观察代码,如果有任何试图滥用指针的情况,CheckPointer将立即报告违规位置。哦,是的,CheckPointer禁止从int到指针的转换:-} 所以CheckPointer不会提供静态诊断“这段代码可能会作弊”,但如果它实际上尝试作弊,你将得到一个诊断。由于所有这些检查都需要付出一定代价,因此CheckPointer的开销相当高,所以你可能需要运行一段时间的代码来获得一些信心,以确保不会发生任何不良情况,然后停止使用它。
编辑:另一位帖子写道对于静态定义的缓冲区,你不能做太多事情。CheckPointer将执行这些测试以及更多其他测试。
#include
指令,看看是否包含了除“白名单”以外的头文件。 - Rafe Kettlerprintf
时,它可以正常工作--无需导入<stdio.h>
。 - user3262424prctl(PR_SET_SECCOMP)
。 - Vi.