Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save chenzx/300a3aa67776cac182aa to your computer and use it in GitHub Desktop.
Save chenzx/300a3aa67776cac182aa to your computer and use it in GitHub Desktop.
C和C++安全编码(原书第2版)
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