 面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭“这是以前的业务逻辑,不用修” “这别人写的代码,不关我事” 大量报告引起不适 刚写的代码立即自动扫描,程序员强迫使用 只体现新增代码问题,责任边界清晰 评审流程多人督促 渐进式开启更多检查器 增量分析减少不适 • 软件工程师一天被邀请进行多次 代码评审,这些都不是他们自身 的KPI • 一旦工期紧996,人工评审容易 变成走形式 • 任务挂着还容易造成工程师焦虑 降低工程师劳动强度 系统地改进分析时间 编译流程 分析流程 依赖关系分析 分布式 编译 分布式 分析 分布式链接 跨模块分析 报告整合 缓存 缓存 缓存 缓存 硬核玩家:从理论上改进静态分析能力 PLDI 2018: 去掉路径 遍历分析中的冗余 ICSE 2019:路径遍历内 存泄漏分析的多项式算法 需求2:误报率要低 方法1: 数据驱动的改进循环 降低 误报率 标注反馈 优化0 码力 | 39 页 | 6.88 MB | 1 年前3 面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭“这是以前的业务逻辑,不用修” “这别人写的代码,不关我事” 大量报告引起不适 刚写的代码立即自动扫描,程序员强迫使用 只体现新增代码问题,责任边界清晰 评审流程多人督促 渐进式开启更多检查器 增量分析减少不适 • 软件工程师一天被邀请进行多次 代码评审,这些都不是他们自身 的KPI • 一旦工期紧996,人工评审容易 变成走形式 • 任务挂着还容易造成工程师焦虑 降低工程师劳动强度 系统地改进分析时间 编译流程 分析流程 依赖关系分析 分布式 编译 分布式 分析 分布式链接 跨模块分析 报告整合 缓存 缓存 缓存 缓存 硬核玩家:从理论上改进静态分析能力 PLDI 2018: 去掉路径 遍历分析中的冗余 ICSE 2019:路径遍历内 存泄漏分析的多项式算法 需求2:误报率要低 方法1: 数据驱动的改进循环 降低 误报率 标注反馈 优化0 码力 | 39 页 | 6.88 MB | 1 年前3
 《深入浅出MFC》2/e的人所需要的一种表明方 式。对我而言,以往遗留的许多疑惑,在此都一一得到了解答。最重要的是,您曾经说过, 学习MFC 的过程中最重要的莫过于自我审视MFC 程序代码的能力。很高兴地,在我看完本书 之后,我确实比以前更有能力来看MFC 源代码了。总之,我为自己能够更深入了解MFC 而 要向您说声谢谢。谢谢您为我们写了深入浅出MFC 这本书。我受益匪浅。 加拿大. 温哥华. 陈宗泰 阁 师您的书,真的是越看越「爽」,而且一定要晚上10:00 以后看,哇,那种感觉真是过瘾。 桃园Shelly 在书局看到您多本书籍,实在忍不住想告诉您我的想法!我是来谢谢您的。怎么说呢?姑且 不论英文能力,看原文书总是没有看中文书来得直接啊!您也知晓的,许多翻译书中的每个 中文字都看得懂,但是整段落就是不知他到底在说啥!因此看到书的作者是您,感觉上就是 一个品质上的保证,必定二话不说,抱回家啰!虽然眼前用不到,但是翻翻看,大致了解一 的programmer 终其一生不会设计一个application framework,这样的蓝图仍 可以为你的对象导向观念带来许多面向的帮助。 我一直希望,能够为此书发行英文国际版。囿于个人的语文能力以及时间,终未能行。但是 看到来自世界各地的华人读者的信函(加拿大、纽西兰、越南、印尼、香港、中国大陆、美 国...),也是另一种安慰。在BBS 及Internet News 看到各界对此书的评介,以及对此书内容0 码力 | 1009 页 | 11.08 MB | 1 年前3 《深入浅出MFC》2/e的人所需要的一种表明方 式。对我而言,以往遗留的许多疑惑,在此都一一得到了解答。最重要的是,您曾经说过, 学习MFC 的过程中最重要的莫过于自我审视MFC 程序代码的能力。很高兴地,在我看完本书 之后,我确实比以前更有能力来看MFC 源代码了。总之,我为自己能够更深入了解MFC 而 要向您说声谢谢。谢谢您为我们写了深入浅出MFC 这本书。我受益匪浅。 加拿大. 温哥华. 陈宗泰 阁 师您的书,真的是越看越「爽」,而且一定要晚上10:00 以后看,哇,那种感觉真是过瘾。 桃园Shelly 在书局看到您多本书籍,实在忍不住想告诉您我的想法!我是来谢谢您的。怎么说呢?姑且 不论英文能力,看原文书总是没有看中文书来得直接啊!您也知晓的,许多翻译书中的每个 中文字都看得懂,但是整段落就是不知他到底在说啥!因此看到书的作者是您,感觉上就是 一个品质上的保证,必定二话不说,抱回家啰!虽然眼前用不到,但是翻翻看,大致了解一 的programmer 终其一生不会设计一个application framework,这样的蓝图仍 可以为你的对象导向观念带来许多面向的帮助。 我一直希望,能够为此书发行英文国际版。囿于个人的语文能力以及时间,终未能行。但是 看到来自世界各地的华人读者的信函(加拿大、纽西兰、越南、印尼、香港、中国大陆、美 国...),也是另一种安慰。在BBS 及Internet News 看到各界对此书的评介,以及对此书内容0 码力 | 1009 页 | 11.08 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 09 CUDA C++ 流体仿真实战;对于写来说越界会放弃写入,不修改数组中的任 何值。 • 表面对象保障了高效的访存,并且自动判断越界,体 现了 GPU 作为图形学专业硬件的能力。 CUDA 纹理对象:封装 • 表面对象访问数组是可读可写的。纹理对象也可以访问 数组,不过是只读的。好处是他可以通过浮点坐标来访 问,且提供了线性滤波的能力。 • 在核函数中可以通过 tex3D 来读取纹理中的值。 • 之所以纹理是因为 GPU 一开始是渲染图形的专用硬件0 码力 | 58 页 | 14.90 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 09 CUDA C++ 流体仿真实战;对于写来说越界会放弃写入,不修改数组中的任 何值。 • 表面对象保障了高效的访存,并且自动判断越界,体 现了 GPU 作为图形学专业硬件的能力。 CUDA 纹理对象:封装 • 表面对象访问数组是可读可写的。纹理对象也可以访问 数组,不过是只读的。好处是他可以通过浮点坐标来访 问,且提供了线性滤波的能力。 • 在核函数中可以通过 tex3D 来读取纹理中的值。 • 之所以纹理是因为 GPU 一开始是渲染图形的专用硬件0 码力 | 58 页 | 14.90 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串3) • s.append(“world”s, 3) 改成 s += string_view(“world”).substr(3) • 又高效,又直观易懂,且 substr 附带了自动检查越界的能力,安 全。 • string_view(“world”) 也可以简写作 “ world”sv ,我们稍后再详细谈 谈。 运算符 + 和 += • 刚刚说了 + 和 += 比 append 更直观,而且只要配合 的成员里, size() 是 O(1) 的。 • 在尾部切片可以用 resize() 修改长度,无需写入字符串本身。 • string_view 和 span 无非是个弱引用版本,额外增加了在头部切片的能力而 已。 强引用胖指针: string • 刚刚说的 string 容器,是掌握着字符串生命周期( lifespan )的胖指针。 • 这种掌管了所指向对象生命周期的指针称为强引用( strong0 码力 | 162 页 | 40.20 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串3) • s.append(“world”s, 3) 改成 s += string_view(“world”).substr(3) • 又高效,又直观易懂,且 substr 附带了自动检查越界的能力,安 全。 • string_view(“world”) 也可以简写作 “ world”sv ,我们稍后再详细谈 谈。 运算符 + 和 += • 刚刚说了 + 和 += 比 append 更直观,而且只要配合 的成员里, size() 是 O(1) 的。 • 在尾部切片可以用 resize() 修改长度,无需写入字符串本身。 • string_view 和 span 无非是个弱引用版本,额外增加了在头部切片的能力而 已。 强引用胖指针: string • 刚刚说的 string 容器,是掌握着字符串生命周期( lifespan )的胖指针。 • 这种掌管了所指向对象生命周期的指针称为强引用( strong0 码力 | 162 页 | 40.20 MB | 1 年前3
 现代C++ 教程:高速上手C++11/14/17/20return x+y; }; add(1, 2); add(1.1, 2.2); 3.2 函数对象包装器 这部分内容虽然属于标准库的一部分,但是从本质上来看,它却增强了 C++ 语言运行时的能力,这 部分内容也相当重要,所以放到这里来进行介绍。 std::function Lambda 表达式的本质是一个和函数对象类型相似的类类型(称为闭包类型)的对象(称为闭包对 象),当 Lambda str = R"(C:\File\To\Path)"; std::cout << str << std::endl; return 0; } 自定义字面量 C++11 引进了自定义字面量的能力,通过重载双引号后缀运算符实现: // 字符串字面量自定义必须设置如下的参数列表 std::string operator"" _wow1(const char *wow1, size_t len)0 码力 | 83 页 | 2.42 MB | 1 年前3 现代C++ 教程:高速上手C++11/14/17/20return x+y; }; add(1, 2); add(1.1, 2.2); 3.2 函数对象包装器 这部分内容虽然属于标准库的一部分,但是从本质上来看,它却增强了 C++ 语言运行时的能力,这 部分内容也相当重要,所以放到这里来进行介绍。 std::function Lambda 表达式的本质是一个和函数对象类型相似的类类型(称为闭包类型)的对象(称为闭包对 象),当 Lambda str = R"(C:\File\To\Path)"; std::cout << str << std::endl; return 0; } 自定义字面量 C++11 引进了自定义字面量的能力,通过重载双引号后缀运算符实现: // 字符串字面量自定义必须设置如下的参数列表 std::string operator"" _wow1(const char *wow1, size_t len)0 码力 | 83 页 | 2.42 MB | 1 年前3
 Hello 算法 1.1.0 C++ 版持。在与读者交流期间,我 最常被问的一个问题是“如何入门算法”。逐渐地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 ——邓俊辉,清华大学计算机系教授 “如果我当年学数据结构与算法的时候有《Hello 算法》,学起来应该会简单 10 倍!” ——李沐,亚马逊资深首席科学家 计算机的出现给世界带来了巨大变革,它凭借高速的计算能力和出色的可编程性,成为了执行算法与处理数 据的理想媒介。无论是电子游戏的逼真画面、自动驾驶的智能决策,还是 AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 ‧ 不同问题的贪心策略的差异较大。对于许多问题来说,贪心策略比较浅显,我们通过一些大概的思考与 尝试就能得出。而对于一些复杂问题,贪心策略可能非常隐蔽,这种情况就非常考验个人的解题经验与 算法能力了。 ‧ 某些贪心策略具有较强的迷惑性。当我们满怀信心设计好贪心策略,写出解题代码并提交运行,很可能 发现部分测试样例无法通过。这是因为设计的贪心策略只是“部分正确”的,上文介绍的零钱兑换就是0 码力 | 379 页 | 18.47 MB | 1 年前3 Hello 算法 1.1.0 C++ 版持。在与读者交流期间,我 最常被问的一个问题是“如何入门算法”。逐渐地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 ——邓俊辉,清华大学计算机系教授 “如果我当年学数据结构与算法的时候有《Hello 算法》,学起来应该会简单 10 倍!” ——李沐,亚马逊资深首席科学家 计算机的出现给世界带来了巨大变革,它凭借高速的计算能力和出色的可编程性,成为了执行算法与处理数 据的理想媒介。无论是电子游戏的逼真画面、自动驾驶的智能决策,还是 AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 ‧ 不同问题的贪心策略的差异较大。对于许多问题来说,贪心策略比较浅显,我们通过一些大概的思考与 尝试就能得出。而对于一些复杂问题,贪心策略可能非常隐蔽,这种情况就非常考验个人的解题经验与 算法能力了。 ‧ 某些贪心策略具有较强的迷惑性。当我们满怀信心设计好贪心策略,写出解题代码并提交运行,很可能 发现部分测试样例无法通过。这是因为设计的贪心策略只是“部分正确”的,上文介绍的零钱兑换就是0 码力 | 379 页 | 18.47 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 C++ 版持。在与读者交流期间,我 最常被问的一个问题是“如何入门算法”。逐渐地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 ——邓俊辉,清华大学计算机系教授 “如果我当年学数据结构与算法的时候有《Hello 算法》,学起来应该会简单 10 倍!” ——李沐,亚马逊资深首席科学家 计算机的出现给世界带来了巨大变革,它凭借高速的计算能力和出色的可编程性,成为了执行算法与处理数 据的理想媒介。无论是电子游戏的逼真画面、自动驾驶的智能决策,还是 AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 ‧ 不同问题的贪心策略的差异较大。对于许多问题来说,贪心策略比较浅显,我们通过一些大概的思考与 尝试就能得出。而对于一些复杂问题,贪心策略可能非常隐蔽,这种情况就非常考验个人的解题经验与 算法能力了。 ‧ 某些贪心策略具有较强的迷惑性。当我们满怀信心设计好贪心策略,写出解题代码并提交运行,很可能 发现部分测试样例无法通过。这是因为设计的贪心策略只是“部分正确”的,上文介绍的零钱兑换就是0 码力 | 379 页 | 18.48 MB | 10 月前3 Hello 算法 1.2.0 简体中文 C++ 版持。在与读者交流期间,我 最常被问的一个问题是“如何入门算法”。逐渐地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 ——邓俊辉,清华大学计算机系教授 “如果我当年学数据结构与算法的时候有《Hello 算法》,学起来应该会简单 10 倍!” ——李沐,亚马逊资深首席科学家 计算机的出现给世界带来了巨大变革,它凭借高速的计算能力和出色的可编程性,成为了执行算法与处理数 据的理想媒介。无论是电子游戏的逼真画面、自动驾驶的智能决策,还是 AlphaGo 的精彩棋局、ChatGPT 的自然交互,这些应用都是算法在计算机上的精妙演绎。 ‧ 不同问题的贪心策略的差异较大。对于许多问题来说,贪心策略比较浅显,我们通过一些大概的思考与 尝试就能得出。而对于一些复杂问题,贪心策略可能非常隐蔽,这种情况就非常考验个人的解题经验与 算法能力了。 ‧ 某些贪心策略具有较强的迷惑性。当我们满怀信心设计好贪心策略,写出解题代码并提交运行,很可能 发现部分测试样例无法通过。这是因为设计的贪心策略只是“部分正确”的,上文介绍的零钱兑换就是0 码力 | 379 页 | 18.48 MB | 10 月前3
 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programming加入分支 现代 CPU 流水线如何应付跳转指令:分支预测 • 但是问题是烧开水被烫伤只是个小概率事件!为了这个千分之一的概率而故意等着不刷牙是 否有点因噎废食?所以现在的 CPU 都有分支预测的能力。举例来说:你每天都执行刚刚 说的那个“早间活动”的任务清单。你发现“如果烧开水被烫伤”这件事似乎从来没发生过,于 是你渐渐意识到,被烫伤是个小概率事件,所以你“预判”到今天应该也不会发生意外,不再0 码力 | 47 页 | 8.45 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programming加入分支 现代 CPU 流水线如何应付跳转指令:分支预测 • 但是问题是烧开水被烫伤只是个小概率事件!为了这个千分之一的概率而故意等着不刷牙是 否有点因噎废食?所以现在的 CPU 都有分支预测的能力。举例来说:你每天都执行刚刚 说的那个“早间活动”的任务清单。你发现“如果烧开水被烫伤”这件事似乎从来没发生过,于 是你渐渐意识到,被烫伤是个小概率事件,所以你“预判”到今天应该也不会发生意外,不再0 码力 | 47 页 | 8.45 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 04 从汇编角度看编译器优化1 个 float 的方式,则称为 标量。 • 在一定条件下,编译器能够把一个处理标量 float 的代码,转换成一个利用 SIMD 指令的 ,处理矢量 float 的代码,从而增强你程序的吞吐能力! • 通常认为利用同时处理 4 个 float 的 SIMD 指令可以加速 4 倍。但是如果你的算法不 适合 SIMD ,则可能加速达不到 4 倍;也有因为 SIMD 让访问内存更有规律,节约了指0 码力 | 108 页 | 9.47 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 04 从汇编角度看编译器优化1 个 float 的方式,则称为 标量。 • 在一定条件下,编译器能够把一个处理标量 float 的代码,转换成一个利用 SIMD 指令的 ,处理矢量 float 的代码,从而增强你程序的吞吐能力! • 通常认为利用同时处理 4 个 float 的 SIMD 指令可以加速 4 倍。但是如果你的算法不 适合 SIMD ,则可能加速达不到 4 倍;也有因为 SIMD 让访问内存更有规律,节约了指0 码力 | 108 页 | 9.47 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 06  TBB 开启的并行编程之旅能提升的时代一去不复返了,现在 要我们动动手为多核优化一下老的 程序,才能搭上摩尔定律的顺风车 。 神话与现实: 2 * 3GHz < 6GHz • 一个由双核组成的 3GHz 的 CPU 实际上提供了 6GHz 的处理能力,是吗? • 显然不是。甚至在两个处理器上同时运行两个线程也不见得可以获得两倍的性能。相似的 ,大多数多线程的应用不会比双核处理器的两倍快。他们应该比单核处理器运行的快,但 是性能毕竟不是线性增长。0 码力 | 116 页 | 15.85 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 06  TBB 开启的并行编程之旅能提升的时代一去不复返了,现在 要我们动动手为多核优化一下老的 程序,才能搭上摩尔定律的顺风车 。 神话与现实: 2 * 3GHz < 6GHz • 一个由双核组成的 3GHz 的 CPU 实际上提供了 6GHz 的处理能力,是吗? • 显然不是。甚至在两个处理器上同时运行两个线程也不见得可以获得两倍的性能。相似的 ,大多数多线程的应用不会比双核处理器的两倍快。他们应该比单核处理器运行的快,但 是性能毕竟不是线性增长。0 码力 | 116 页 | 15.85 MB | 1 年前3
共 19 条
- 1
- 2













