Created
June 16, 2014 06:40
-
-
Save chenzx/300a3aa67776cac182aa to your computer and use it in GitHub Desktop.
C和C++安全编码(原书第2版)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
C和C++安全编码(原书第2版) | |
跳转至: 导航、 搜索 | |
p77 W ^ R:不能同时既可写又可执行 | |
p102 alloca()不需要free()! | |
C99 *VLA:int a[n]; //注意这里局部数组长度为变量 | |
p110 DR 400(realloc相关的问题) | |
p111 ?new int()与new int | |
p112 new(std::nothrow) T; //失败时返回0 | |
p116 ?C++11 安全派生指针?enum class pointer_safety { relaxed, preferred, strict }; | |
p122 两次释放问题:==> std::shared_ptr | |
p127 unlink技术:攻击使用了C库dlmalloc的程序(PREV_INUSE) | |
利用缓冲区溢出操纵内存块的边界标志(指示块的大小、分配状态等),以欺骗unlink()宏向任意位置写入4字节数据 | |
(说白了,这个漏洞仍然是由于没有检查strcpy目标缓冲区长度导致) | |
p131 双重释放漏洞的利用攻击* | |
导致双链表节点的前向和后向指针变成自引用,(有可能导致)同样的内存被反复返回给用户的malloc请求 | |
p135 RtlHeap | |
p142 PE格式来自于VAX/VMS上的COFF,这是因为原始的Windows NT团队大部分来自于DEC... | |
p147 phkmalloc | |
p149 jemalloc | |
p164 GCC假设在所有优化级别未定义行为(如整数溢出)不会发生 | |
p165 char可能是有符号/无符号,应显式指定signed/unsigned | |
p188 C11 6.5.5:(a/b)*b + a%b应等于a,否则行为未定义 | |
p242 多线程 vs 并发 vs 并行 | |
p251 内存模型 | |
编译器对语句重新排序? | |
数据竞争 | |
Happens-Before | |
?宽松的原子操作 | |
p256 volatile atomic_flag shared_lock; //原子对象, .test_and_set() | |
atomic<int> shared_lock:while( !atomic_compare_exchange_weak(&shared_lock, &zero, 1) ) sleep(1); | |
内存栅栏:atomic_thread_fence( memory_order_seq_cst ); | |
p259 线程角色分析? | |
[[thrd_role_inc(Event, Compute)]] | |
p267 (锁)争用 | |
p268 ABA问题 | |
(无锁数据结构)线程A两次读取得到相同的值,但是之间线程B已经修改过这个值,并改回来... | |
(设想一下一个Node*被delete然后重新new回来) | |
==> hazard指针(一个标记,其他线程看到这个标记必须复制然后修改自己的副本) | |
PS:实际上这里如果对共享变量的更新实现完全的版本化链就没有问题(如Clojure的Ref,Scala的immutable集合) | |
p274 其他解决方案:Cilk、Intel TBB、OpenMP、QtConcurrent | |
p300 规范化(realpath()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment