Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316771
  • 博文数量: 57
  • 博客积分: 146
  • 博客等级: 入伍新兵
  • 技术积分: 769
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-29 14:57
文章分类
文章存档

2014年(39)

2013年(13)

2012年(5)

我的朋友

分类: C/C++

2014-06-24 14:24:56

1.Do not modify constant values
C99标准中说:
若通过非const型左值修改const类型的对象,该行为是未定义。

点击(此处)折叠或打开

  1. char const **cpp;
  2. char *cp;
  3. char const c = 'A';
  4. cpp = &cp; /* constraint violation */
  5. *cpp = &c; /* valid */
  6. *cp = 'B'; /* valid */


2.不要通过非volatile引用来访问一个volatile对象.
C99标准中说:
如果通过volatile限定类型左值引用volatile限定类型定义的对象行为是未定义的

点击(此处)折叠或打开

  1. static volatile int **ipp;
  2. static int *ip;
  3. static volatile int i = 0;
  4. printf("i = %d.\n", i);
  5. ipp = &ip; /* constraint violation */
  6. *ipp = &i; /* valid */

3.不要引用未初始化的值
自动变量被初始化前,其值是未意料的。C99规定“如果一个具有自动存储期的对象未显式初始化,它的值是不确定的”。
错误代码:

点击(此处)折叠或打开

  1. void log_error(char *msg) {
  2.     char *log;
  3.     char buffer[24];
  4.     sprintf(buffer, "Error: %s", log);
  5.     printf("%s\n", buffer);
  6. }
正确代码:

点击(此处)折叠或打开

  1. void log_error(char *msg) {
  2.     char *log = msg;
  3.     char buffer[24];
  4.     sprintf(buffer, "Error: %s", log);
  5.     printf("%s\n", buffer);
  6. }

4.在解引用指针前,保证指针是有效地。解引用一个非法指针,其行为是未定义,典型行为是中断程序执行。

点击(此处)折叠或打开

  1. size_t size = strlen(input_str);
  2. if (size == SIZE_MAX) { /* test for limit of size_t */
  3. /* Handle Error */
  4. }
  5. str = malloc(size+1);
  6. strcpy(str, input_str);
  7. /* ... */
  8. free(str)
若malloc失败,没有对str进行有效判断。
正确代码:

点击(此处)折叠或打开

  1. size_t size = strlen(input_str);
  2. if (size == SIZE_MAX) { /* test for limit of size_t */
  3. /* Handle Error */
  4. }
  5. str = malloc(size+1);
  6. if (str == NULL) {
  7. /* Handle Allocation Error */
  8. }
  9. strcpy(str, input_str);
  10. /* ... */
  11. free(str)









阅读(444) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~