编译器安全测试
1. 编译器如何危及应用程序的安全
对于编译器如何将人类可读的代码翻译成机器运行的机器码,大多数程序员通常只有大概的概念。在编译过程中,编译器会对代码进行优化,使其能高效的运行。有的时候,编译器在优化上面走的太远了,它甚至移除了本不应该移除的代码,导致应用程序更加脆弱。
MIT人工智能和计算机科学实验室的四位研究人员调查了(PDF) 不稳定优化(optimization-unstable)代码的问题——编译器移除的包含未定义行为的代码。所谓的未定义行为包括了除以0,空指针间接 引用和缓冲溢出等。在某些情况下,编译器完整移除未定义行为代码可能会导致程序出现安全弱点。
研究人员开发了一个静态检查器STACK去识别不稳定的 C/C++代码,他们在足球平台出租测试的系统中发现上百个新bug:Linux内核发现32个bug,Mozilla发现3个,Postgres 9个和Python 5个。STACK扫描了Debian Wheezy软件包仓库8575个含有C/C++代码的软件包,发现其中3471个至少包含一个不稳定的代码。研究人员认为这是一个非常普遍的问题。
2. 代码测试工具Fortify最新版本介绍及实操
Fortify代码测试工具是安全测试、代码审计中的重要软件测试工具,支持多种语言和组件级API,覆盖多种SAST漏洞分类。最新发布的Fortify 22.1.0版本相较于之前版本,对操作系统、编译器、构建工具、语言和框架进行了更新,并新增了对macOS 12、Windows 11、Clang 13.1.6、OpenJDK javac 17、Swiftc 5.6、cl (MSVC) 2015和2022、Gradle 7.4.x、MSBuild 14.0、17.0、17.1和17.2、Xcodebuild 13.3和13.3.1的支持。此版本还对C# 10、.NET 6.0、C/C++ 20、HCL 2.0、Java 17、TypeScript 4.4和4.5提供了支持,并改进了Visual Studio 2022、IntelliJ 2021.x的兼容性。
Fortify 22.1.0版本新增功能包括操作系统、编译器、构建工具、语言和框架的更新,以及改进的兼容性。在最新版本中,你可以发现新增了对macOS 12、Windows 11、Clang 13.1.6、OpenJDK javac 17、Swiftc 5.6、cl (MSVC) 2015和2022、Gradle 7.4.x、MSBuild 14.0、17.0、17.1和17.2、Xcodebuild 13.3和13.3.1的支持。此外,此版本还支持C# 10、.NET 6.0、C/C++ 20、HCL 2.0、Java 17、TypeScript 4.4和4.5。
在实操方面,Fortify提供了多种方式供用户进行代码测试。例如,通过“Audit Workbench”进行测试,此工具支持Java语言源代码的测试。用户可以在主页面选择代码测试语言类型,选择被测试代码所在目录,选择Java版本,进行代码测试配置,运行代码测试,查看代码测试结果。同时,用户还可以通过“Tools-Reports”生成测试报告,选择报告模板,生成BIRT报告或Legacy报告。
除了通过“Audit Workbench”进行测试,Fortify还支持通过“Scan Wizard”和命令行进行测试。通过命令行方式,用户可以对各语言源代码进行测试。在后续的文章中,将详细介绍这两种测试方式的详细操作步骤。
在Fortify 22.1.0版本中,新增了多项功能和改进,使得用户可以更方便地进行代码测试和安全测试。同时,Fortify还提供了多种方式供用户进行测试,包括“Audit Workbench”、“Scan Wizard”和命令行方式,为用户提供更灵活的选择。
以上内容介绍了Fortify代码测试工具最新版本的一些新功能和实操方式。了解更多内容,请查看相关链接。同时,@道普云将持续输出软件测试技术、软件测试团队建设、软件测评实验室认可等内容,欢迎交流探讨。
3. C语言中编译 生成 调试 测试 运行各是什么意思有什么区别
C语言中的编译、生成、调试、测试和运行各自代表不同的阶段和活动,具体如下:
1. 编译:编译是将C语言源代码转换为目标代码的过程。在Visual C++(VC)中,编译阶段会将源代码(.c文件)转换成目标文件(.obj文件),这个过程称为编译。编译器检查源代码的语法错误,并生成可以被计算机执行的中间代码。
2. 生成:生成通常指的是构建过程,这个阶段会使用链接器将编译后的目标文件与其他库文件链接起来,形成一个可执行的程序。在VC中,生成阶段会创建PE(Portable Executable)格式的文件,如.exe可执行文件或.dll动态链接库。
3. 调试:调试是在程序运行时对程序进行的一系列检查和测试活动,旨在发现并修复程序中的错误。调试通常在IDE的调试器中进行,开发者可以单步执行代码,观察变量值,并找出代码中的问题。
4. 测试:测试是验证程序功能是否符合预期设计的阶段。它包括多种类型的测试,如单元测试、集成测试和系统测试。测试旨在确保程序的每个部分都能正确工作,并且整个系统满足预定的需求。
5. 运行:运行是指程序在计算机上实际执行的过程。在编译和链接后,可执行文件会被加载到内存中,并由操作系统执行,这时程序开始运行,执行其预定功能。
总结来说,C语言程序的开发过程中,编译是将源代码转换为目标代码,生成是创建最终可执行程序,调试是找出并修复错误,测试是验证程序的正确性,而运行是程序执行的阶段。这些阶段共同确保了程序从设计到最终使用的完整性。