> 技术文档 > 浅谈防御性编程和安全与开发体验的平衡——在Windows平台上采用Docker与VSCode进行C++开发

浅谈防御性编程和安全与开发体验的平衡——在Windows平台上采用Docker与VSCode进行C++开发


浅谈防御性编程和安全与开发体验的平衡——在Windows平台上采用Docker与VSCode进行C++开发

0.前言

笔者在尝试在本机上部署GitHub开源项目MilkDown的时候,由于其开发语言为TypeScript且项目本身为编辑器领域的底层框架,笔者不太熟悉,因此使用DeepSeek进行辅助,但是由于DeepSeek的输出并不全然准确,因此最终失败。因为笔者是直接在本机上进行部署,并未做任何隔离等安全措施,导致本机的系统环境和工具链遭到了污染,为生产和开发带来不便。笔者从此次事件中深感防御性编程和安全问题的重要性,并由此引发了将闲时的C++开发迁移进入Docker容器中的想法。

1.防御性编程思想和隔离技术

防御性编程(Defensive Programming)是一种以提高软件健壮性为核心的开发哲学。其核心思想内涵为不信任原则(Zero Trust)、容错与最小化影响、契约式设计(Design by Contract),哲学基础源自墨菲定律(Murphy’s Law):“可能出错的事总会出错”。防御性编程是对不确定性的主动应对,而非被动接受“垃圾进,垃圾出”(GIGO)。
沙盒/虚拟机隔离环境、容器技术等技术实践,是防御性编程思想的核心体现。这些措施通过系统化的风险隔离和资源管控,主动预防软件环境冲突或恶意行为导致的系统不稳定。防御性编程的核心原则在隔离技术中的体现通常为输入验证与风险隔离、最小权限原则、故障分层遏制和资源边界管控。无论是对下载的开源项目进行编译和部署还是在进行开发时,采用隔离技术都是理性且正确合理的选择。

2.在Windows平台上采用Docker与VSCode进行C++开发

笔者采用的版本:
Windows 11 专业版 24H2
Docker 28.3.2
VSCode 1.102.3

①安装VSCode插件

Dev Containers、C/C++、远程开发扩展包(4个)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

②创建 .devcontainer 文件夹并配置

创建dockercpp-helloworld文件夹作为项目文件夹,右键单击→在终端中打开,进入cmd,输入以下命令打开VSCode:

code .

之后在VSCode中在当前目录下新建文件夹.devcontainer,再在.devcontainer文件夹中新建devcontainer.json,配置如下内容:

{\"image\": \"ubuntu\", // 确认镜像名正确\"mounts\": [\"source=${localWorkspaceFolder},target=/workspace,type=bind\"],// 添加权限兼容性配置(针对 Linux 容器)\"runArgs\": [\"--cap-add=SYS_PTRACE\",\"--user=root\"],\"customizations\": {\"vscode\": {\"extensions\": [\"ms-vscode.cpptools\"]}}}

记得保存文件,否则进入容器时会报错。

③构建并进入容器

F1键,选择Dev Containers:Reopen in Container(首次打开)或者Dev Containers:Rebuild and Reopen in Container(修改了 .devcontainer 后),进入容器。(拉取镜像失败的话可更换国内Docker镜像源或者使用代理进行尝试)

④编写与调试 C++ 代码

在文件夹下新建文件main.cpp,输入以下内容并保存:

#include int main() {std::cout << \"Hello Docker C++!\\n\";return 0;}

之后在容器内终端安装编译与调试工具:

apt update && apt install -y build-essential gdb

打开命令面板(Ctrl+Shift+P),输入Tasks: Configure Task,选择C/C++: g++ 生成活动文件
之后切换到调试视图(左侧活动栏的虫子图标),点击创建 launch.json 文件 → 选择C++ (GDB/LLDB) → 选择(gdb) 启动,在configurations里面加入以下内容:

\"preLaunchTask\": \"C/C++: g++ 生成活动文件\", // 必须与tasks.json 中的label一致

同时记得将program改为以下内容:

\"program\": \"${fileDirname}/${fileBasenameNoExtension}\", // 可执行文件路径

之后就可以设置断点,摁F5进行调试了。
完成后,点击左下角的蓝色图标(显示为 >< 开发容器 @ desktop-linux ),选择:在本地重新打开文件夹,即可退出容器回到本地。

3.安全与开发体验的平衡

虽然在实践中采用防御性编程思想和隔离技术对于保障安全可以起到显著的积极作用,但是如何在保障安全的同时平衡开发体验同样是一个重要的论题。笔者认为有一下几点需要注意:

  • 并非绝对化:对可信赖的小型工具,主机编译效率更高。
  • 工具选择需权衡:日常开发推荐容器(Docker),内核级操作需用虚拟机(VMware/VirtualBox)。
  • 风险意识是关键:即使编译成功,残留的临时文件或环境变更仍可能埋下隐患。

技术决策应基于项目规模、信任等级及操作风险综合判断,隔离环境是防御性编程的延伸,而非教条约束。
而在对于隔离技术的实践,笔者的建议为分层选择隔离方案:

场景 推荐方案 优势 适用案例 轻量级脚本/单文件程序 沙盒(Sandboxie/Python虚拟环境) 低开销,快速清理 Python 脚本、小型工具 复杂编译/高危操作 虚拟机(VirtualBox/VMware) 完全系统隔离,支持快照回滚 内核模块编译、未知来源软件 常规安装 包管理器(apt/yum) 自动依赖管理,无需隔离 开源仓库已验证的软件