C语言¶
自实现锁¶
使用gcc 提供的 __sync_bool_compare_and_swap, 可以实现自己的锁,该函数是一个 原子操作:
// 如果 \*lock 的值等于 old, 那么就把set 写入*lock, 否则不写
__sync_bool_compare_and_swap(lock, old, set)
用法示例: example
内存池¶
nginx 的内存池实现
用法示例: example
相关链接: http://www.alidata.org/archives/1390
相关链接: http://www.cnblogs.com/jzhlin/archive/2012/06/06/2537710.html
哈希表¶
glib 库(gnome基本库) 提供了一套 哈希表
示例: example
相关链接: https://developer.gnome.org/glib/2.30/glib-Hash-Tables.html#g-hash-table-new
内存覆盖bug¶
strcpy函数并不会检测参数范围,如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | include <stdio.h>
int main ()
{
int flag;
char buf[10];
strcpy (buf, argv[1]);
if (strcmp (“abc123”, buf) == 0) {
flag = 1;
} else
flag = 0;
if (flag) {
printf (“successful”);
}
}
|
这是一个验证密码的程序, 有办法让你不知道密码,也能登陆。只要输入的字符串足够长就行, 原理: strcpy 不会考虑第一个参数 的内存大小,如果 argv[1]足够大 导致buf已经复制不下,那么会 溢出复制。就是往内存中后续的 地址复制。 内存中存储可能如下:
--------------
| --内存中---|
|____________|
| buf 变量 |
|____________|
| flag 变量 |
--------------
当输入足够长, 利用strcpy函数不保证边界检测的特性, 后续的字符会覆盖下面的变量flag