通过代码数据学习来解决软件任务的编程工具在提升开发人员生产力方面展现了早期的潜力。然而,这些工具在鲁棒性方面以及它们对软件安全性和可靠性的最终影响上仍然存在显著差距——这些问题甚至对经验丰富的开发人员来说仍是挑战。本论文旨在从安全性和可靠性的角度推动代码机器学习领域的发展。我们提出了训练机器学习模型的新技术,以使其具备强大的推理能力,能够处理与安全性和可靠性相关的问题。 我们首先介绍了利用监督学习信号来增强程序分析的方法。作为这一方法的实例,我们提出使用模仿学习框架,从符号执行中学习一个有效且快速的模糊测试器。首先,符号执行专家为大量程序生成高质量输入数据集。然后,利用该数据集训练一个神经网络模糊测试器,使其模仿专家的行为。训练好的模糊测试器随后被部署以测试新程序。
此外,我们研究了分布漂移问题,这是阻碍深度学习模型在现实场景中有效检测漏洞的关键问题。分布漂移发生在训练和评估所用的数据集与实际遇到的漏洞分布不一致时。为了解决这个问题,我们提出了一种两阶段的训练方法。首先,模型在大量的合成漏洞上进行训练,然后进一步在一个更接近实际漏洞分布的数据集上进行训练。 最后,我们从两个互补的角度探讨了代码生成中的安全性问题。我们不仅寻求改进生成安全代码的能力,还研究了从对抗角度降低安全级别的可能性。为实现这些目标,我们提出了一个统一的微调框架,采用专门的优化目标,既优化安全性又保持模型生成功能性正确代码的能力。