本文主要记录c语言编码过程中的一些注意事项。

1 C语言编码注意事项

1.1 申请的动态内存一定要做初始化工作

例如:如下所示的代码,若未对table->bucket指针数组赋初值,该数组中就有可能存在非法值,导致代码访问到非法内存。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int initHashTable(HashTable* table, int bucket_num)
{
   table->bucket_num = bucket_num;
   table->bucket = (HashNode**)malloc(sizeof(HashNode*) * bucket_num);
   if (table->bucket == NULL) {
       printf("Alloc memory failed.\n");
       return -1;
   }
    // 此处一定要做初始化工作,否则可能存在非法内存访问的情况
   memset(table->bucket, 0, sizeof(HashNode*) * bucket_num);
   return 0;
}

1.2 对结构体变量初始化时,需要初始化所有的变量

实例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
struct ListNode {
    int val;
    struct ListNode *next;
};

ListNode* initNode(int val)
{
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    if (node == NULL) {
        return NULL;
    }
    node->val = val;
     // 注意此处一定要初始化,否则有可能访问到非法内存
    node->next = NULL;
}

2 c语言编译相关

2.1 C语言使用asan的方法

C语言使用asan的方法:

  1. 环境安装和gcc版本对应的libasan版本。
  2. 编译代码时添加-fsanitize=address参数。

例如:

1
gcc  -Wall -g -std=c99 -fsanitize=address lru.c -o lru

备注:ubuntu系统中不同asan版本和gcc的对应关系。

  • libasan0: gcc-4.8
  • libasan2: gcc-5
  • libasan3: gcc-6
  • libasan4: gcc-7
  • libasan5: gcc-8