mirsa c

Rule 1. 严格遵循ANSI C89标准,不允许任何扩展。



Rule 3. 如果要嵌入汇编语言,则必须将所有汇编语句包装在C函数里,而且这些函数中只有汇编语句,没有常规C语句。

   

Rule 7. 不得使用三元操作符(? : )



Rule 10. 不得残留被注释掉的废代码。



Rule 11. 所有标识符不超过31字符。



Rule 12. 不同名空间中的变量名不得相同。

        例如:

            typedef struct MyStruct {... } MyStruct;  (违规)



            struct Person {

              char* name;

              ...

            };



            char name[32];  (违规)



Rule 13. 不得使用char, int, float, double, long等基本类型,应该用自己定义的类型显示表示类型的大小,如CHAR8, UCHAR8, INT16, INT32, FLOAT32, LONG64, ULONG64等。



Rule 14. 不得使用类型char,必须显示声明为unsigned char或者signed char。



Rule 18. 所有数字常数应当加上合适的后缀表示类型,例如51L, 42U, 34.12F等。



Rule 19. 禁止使用八进制数。(因为086U这样的常数很容易引起误解)。



Rule 21. 不得定义与外部作用域中某个标识符同名的对象,以避免遮盖外部作用域中的标识符。



Rule 23. 具有文件作用域的对象尽量声名为static的。



Rule 24. 在同一个编译单元中,同一个标识符不应该同事具有内部链接和外部链接的声名。



        这里我略作说明:

       

        我们通常将一些放在头文件里的变量声名为“外部链接”的,如:

        extern UINT32 g_count;  // 俗话叫变量声明(对应于变量定义,不分配实际空间)



        对于“使用”这个变量的.c文件来说,这很好,因为g_count始终保持外部链接性质。可是对于定义g_count(实际分配空间)的.c文件来说,如果包含了上述的头文件,则在这个编译单元里就发生了内部链接和外部链接的冲突。解决办法是,定义g_count的文件尽量不要包含声名g_count的头文件。个人感觉这不是任何时候都做得到的,尤其是在对付遗留代码的时候。



Rule 25. 具有外部链接性质的标识符应该只声明一次。



Rule 27. 外部对象不得在多个文件中声名。



Rule 28. 禁止使用register关键字。



Rule 29. 自动对象(栈对象)使用前必须赋初值。



Rule 33. 操作符&&和||的右侧表达式不得具有副作用(side-effect)。

        也就是说,象 if (x == 20 && ++y == 19)这样的表达式被禁止。



Rule 35. 在返回布尔值的表达式中不得出现赋值操作。

        也就是说,我们常用的 if (!(fp = fopen("fname", "r"))) { /* error */ }

        被禁止。



Rule 37. 不得对有符号数施加位操作,例如 1 << 4 将被禁止,必须写 1UL << 4;



Rule 39. 不得对有符号表达式施加一元 "-" 操作符。



Rule 40. 不得对有副作用的表达式施加sizeof操作符。



Rule 42. 除了循环控制语句,不得使用逗号表达式。



Rule 44. 禁止冗余的显式转型。比如: double pi = (double) 3.1416F;



Rule 45. 禁止从任意类型到指针的强制转型,禁止从指针到任意类型的强制转型。

        例如:void* p = (void*)0xFFFF8888UL;



Rule 49. 显示测试值是否为零。



Rule 50. 不得显式判断浮点数的相等性和不等性。



Rule 52. 不得遗留“永远不会用到”的代码。



Rule 53. 所有非空语句必须具有副作用。



Rule 55. 除了switch语句,不得使用标号(label)。



Rule 56. 不得使用goto.



Rule 57. 不得使用continue。



Rule 58. 除了switch语句,不得使用break.



Rule 59. if, else if, else, while, do..while, for语句块必须使用{}括起。



Rule 60. 任何if..else if 语句,最后必须有一个收尾的else。例如:

        if (ans == 'Y') {

          ...

        }

        else if (ans == 'N') {

          ...

        }

        else if (ans == 'C') {

          ...

        }

        else {

          ;

        }



Rule 67. 循环计数器的值不得在循环体内修改。



Rule 70. 禁止任何直接和间接的递归函数调用。



Rule 82. 每个函数只能有一个推出点。



Rule 86. 如果一个函数可能返回错误信息,则调用后必须加以测试。



Rule 92. 不应该使用#undef



Rule 95. 不得将宏作为参数传给宏函数



Rule 98. 在一个宏定义中,#或##符号只能出现一次。



Rule 101. 禁止指针运算(代之以数组下标运算)。



Rule 102. 禁止超过两级的指针。



Rule 104. 禁止使用指向函数的非常量指针。



Rule 106. 不得将栈对象的地址传给外部作用域的对象。



********************************************************************

后面的规则针对实时嵌入式系统,对其他类型的开发未必适用,如:



Rule 118. 禁止使用动态堆分配(也就是不得使用malloc, calloc和realloc)。



Rule 119. 禁止使用errno。



Rule 120. 禁止使用offsetof.



Rule 121. 禁止使用<locale.h>;



Rule 122. 禁止使用setjmp, longjmp.



Rule 123. 禁止使用<signal.h>;



Rule 124. 禁止使用<stdio.h>;(不能用printf, scanf了!)



Rule 125. 禁止使用atoi, atof, atol。(这个我很赞成,建议使用strtol, strtod等函数)



Rule 126. 禁止使用abort, exit, getenv。



Rule 127. 禁止使用<time.h>;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Keil MDK中配置PClint的方法如下: 1. 首先,确认你使用的是Keil MDK版本5.24或以上版本。这是因为低于这个版本的Keil MDK界面不一样,无法直接选用规则。 2. 安装PClint 9.0。你可以在网上搜索PClint 9.0的安装教程,按照顺序进行安装。安装过程中,将pclint9setup.exe安装到默认目录C:\lint下,并将patch文件夹下的内容拷贝到C:\lint下。如果你的系统是32位,则执行patch.bat;如果是64位,则执行patch64.bat。执行完成后,会提示升级成功。 3. 打开Keil MDK,选择Tools -> Setup PC Lint。这会弹出PClint的配置界面。 4. 在PC-lint配置界面中,点击红色标注1的区域,选择lint工具。然后点击红色标注2的区域,定位到Keil安装目录下的ARM/bin文件夹中的CO-KCARM.LNT文件,该文件是对应Keil ARM编译器的PClint检查配置文件。最后,点击红色标注3的区域,设置检查规则。例如,你可以选择mirsa 2004规则。设置完成后,点击‘OK’退出。 5. 运行PClint进行检查: - 如果你只想检查当前打开的C源文件,可以选择Tools -> Lint。 - 如果你想检查工程中的所有C源文件,可以选择Tools -> Lint All C Source Files。 6. PClint的信息会显示在Build -> Output窗口中。如果你想定位到相应的源代码行,可以双击Lint信息行编辑器。 以上是在Keil5中配置PClint的详细步骤。参考和提供的内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Keil MDK中使用配置pc-lint记录](https://blog.csdn.net/qq_39687342/article/details/106102078)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [PC-LINT9.0在keil5中的使用教程](https://download.csdn.net/download/u011776903/9675022)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Keil MDK中使用pc-lint的详细方法](https://blog.csdn.net/zhzht19861011/article/details/5930634)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值