Finding Bugs using Path-Sensitive Static Analysis
if (var == 1) { *p = 42; // Null dereference? } } p -> Unknown p -> NotNull p -> Unknown p -> Null p -> MaybeNull p -> MaybeNull Warning Unknown Null NotNull MaybeNull Analysis state (cond) { var = 2; p = nullptr; } // branch 3 if (var == 1) { *p = 42; // Null dereference? } }Flow-sensitive analysis resourcesPath- sensitive checksvoid path_sensitive(int *p = 42; // Null dereference? } } p: ?1 cond: ?2 var: 0 p: ?1 cond: ?2 var: 1 ?1 != 0 p: null cond: 1 var: 2 p: null cond: ?2 var: 0 p: ?1 cond: 0 var: 1 ?1 != 0 p: null cond: 1 var:0 码力 | 35 页 | 14.13 MB | 5 月前3谈谈MYSQL那点事
一般针对数据分散的关键字进行建立索引,比如 一般针对数据分散的关键字进行建立索引,比如 像性别、状态值等等建立索引没有意义 像性别、状态值等等建立索引没有意义 字段唯一,最少,不可为 字段唯一,最少,不可为 null null 对大数据量表建立聚集索引,避免更新操作带来的碎片。 对大数据量表建立聚集索引,避免更新操作带来的碎片。 尽量使用短索引,一般对 尽量使用短索引,一般对 int int 、 、 联合索引,请注意提取字段的前后顺序 联合索引,请注意提取字段的前后顺序 针对索引字段使用 针对索引字段使用 >, >=, =, <, <=, IF NULL >, >=, =, <, <=, IF NULL 和 和 BETWEEN BETWEEN 将会使用 将会使用 索引, 如果对某个索引字段进行 索引, 如果对某个索引字段进行 LIKE LIKE 件可以使用聚集索引,如果是非聚集索引将起到相反的结果 当只要一行数据时使用 当只要一行数据时使用 LIMIT 1 LIMIT 1 尽可能的使用 尽可能的使用 NOT NULL NOT NULL 填充数据库 填充数据库 拆分大的 拆分大的 DELETE DELETE 或 或 INSERT INSERT 语句 语句 批量提交 批量提交 SQL SQL 语句 语句0 码力 | 38 页 | 2.04 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针
他不需要手动 & 来创建。 • 他不需要手动 * 来创建。 • 他无法重新赋值,指向新的变量。 • 他无法为空指针。 C 语言指针:可以为空指针( NULL ) • 指针可以指向一个变量,也可以什么都不指向 ,也就是空指针,也就是 NULL 。 • 在右边的例子中,我们用空指针来表示“调用者 不需要 second 返回”。在 func 内还需要通过 if (psecond) 来判断是否为空。 传一个空指针,就表示“用户不想指定 这个参数”的意思。 C++ 可以用更安全的 func(std::optionalpars) 来替代。 NULL 的定义为什么是这样的? • 如果你看过标准库的头文件内容,会看到 NULL 的 本质无非是一个宏。那为什么要这样定义呢? • 可见他在 C++ 中会直接定义为常数 0 ,而 C 语言 中却定义为 ((void*)0) ,为什么会区别对待? void 指针转换成 int ,因此老的定义是不能用的,所以才 额外规定 0 才是空指针。 用 0 代替 NULL ,这样也可以? • 因此 C++ 中你可以用 0 代替 NULL , 因为 C++ 额外规定了 0 可以是表示空指 针,也可以是数字 0 。 用 0 代替 NULL ,会产生重载的麻烦 • 不过这样问题也非常大,如果正好 func 有两个重载,分别是 func(int*) 0 码力 | 128 页 | 2.95 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
vector一样, vector 那 一课讲的几乎全部知识也适用于 string 。 字符串胖指针 第 7 章 C 语言 0 结尾字符串 • C 语言为什么喜欢 0 结尾字符串( null-terminated string )呢? • 众所周知,要描述一个动态长度的数组(此处为字符串),需要首地址指针和 数组长度两个参数。 • void cihou_array(char *ptr 这样好麻烦,明明是一个字符串,却要传两个参数进去!能不能简化? • C 语言认为:假定字符串中的字符不可能出现 ‘ \0’ ,那么可以用 ‘ \0’ 作为结 尾的标记符,这就是当年最流行的 0 结尾字符串( null-terminated string ) 方案。 0 结尾字符串的缺点 • 1. 字符串本身不能含有 ‘ \0’ • 例如: {‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’, ‘c’ 0 码力 | 162 页 | 40.20 MB | 1 年前3绕过conntrack,使用eBPF增强 IPVS优化K8s网络性能
Move IPVS Netfilter hook from local-in to PREROUTING • The challenges • Skb’s pointer to route is NULL during PREROUTING • No de-fragment is done during PREROUTING IPVS bypass conntrack (con.) • Egress0 码力 | 24 页 | 1.90 MB | 1 年前3应用 waPC (rust) 做软件测试工具
http_res = foo_http_response(msg)?; foo_assert_eq! (http_res.HttpBody.get("data").unwrap_or(&mut NULL),&json!("hi"),"data is hi"); Ok(msg.to_vec()) } 自动化 HTTP 请求例子 自动化测试以循环方式执行 测验报告 HTML/ JSON0 码力 | 30 页 | 2.50 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型
用一个指针的数组来表示 图片解释:指针数组的原理 1 nul nul 2 3 nul nul nul nul 表示 nullptr (空指针) 图片解释:指针数组的稀疏 这样指针表中为 null 的部分,稠密叶节点的内存就省掉 了 垃圾回收 (garbage-collect) • 如果是运行的仿真,则液体可能会移动到 别的地方去。这时液体曾经存在过的地方 也仍然处于激活状态,可以每隔若干帧及0 码力 | 102 页 | 9.50 MB | 1 年前3Working with Asynchrony Generically: A Tour of C++ Executors
keyboard callback that reads the completion info out of the global and completes it if it’s not null.86 KEYCLICK SENDER // Type-erased receiver waiting for a keyclick: struct pending_completion {0 码力 | 121 页 | 7.73 MB | 5 月前3C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程
其实可以看做是为了支持多线程而 顺带引入的……如 chrono 、移动 、 lambda 、 RAII…… 第 0 章:时间 C 语言如何处理时间: time.h • long t0 = time(NULL); // 获取从 1970 年 1 月 1 日到当前时经过的秒数 • sleep(3); // 让程序休眠 3 秒 • long t1 =0 码力 | 79 页 | 14.11 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理
new C(...) 等价,括号里也可以有 其他构造函数的参数。 unique_ptr :封装的智慧 • 在旧时代 C++ 里,常常听到这样的说法: • “ 释放一个指针后,必须把这个指针设为 NULL , 防止空悬指针!” • delete p; • p = nullptr; • unique_ptr 则把他们封装成一个操作:只需要 • p = nullptr; // 等价于:0 码力 | 96 页 | 16.28 MB | 1 年前3
共 10 条
- 1