zoukankan      html  css  js  c++  java
  • 【转】VS 安全开发生命周期(SDL)检查

    前面在学习使用google的protobuf时在VS2012中一直无法编译编译通过,经过查找一些资料原来发现,并不是protobuf的问题,而是自己在使用VS2012时,没有完全了解VS2012的强大功能,和跟以前VS2010的差别,导致无法编译通过。

    现在就来说说为什么没有编译通过,在VS2012创建项目时,会有一个勾选项,叫做“安全开发生命周期(SDL)检查”,这个东西是微软在VS2012新推出的东西,为了是能更好的监管开发者的代码安全,如果勾选上这一项,那么他将严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译,比如在VS2010中的scanf是warning那么在VS2012中就是error了。

    查看MSDN中对SDL的描述,SDL检查会视以下告警为错误:

    /sdl 启用警告

    等效的命令行开关

    描述

    C4146

    /we4146

    一元负运算符应用于无符号类型,从而导致无符号结果。

    C4308

    /we4308

    一个负整型常数转换为无符号类型,从而导致一个可能无意义结果。

    C4532

    /we4532

    __finally /finally中的关键词,使用continue, break 或 goto在异常终止块未定义行为。

    C4533

    /we4533

    初始化变量的代码不会执行。

    C4700

    /we4700

    使用未初始化的局部变量。

    C4703

    /we4703

    对一个潜在的未初始化的局部指针变量的使用。

    C4789

    /we4789

    当使用时,请缓冲区溢出特定 C 运行时 (CRT) 函数。

    C4995

    /we4995

    使用函数的标deprecated

    C4996

    /we4996

    使用函数的标记作为deprecated

    也就是在编译的时候,当SDL检查启用时,编译器会严格检测缓冲区的溢出,并且会在delete某个指针时,自动为这个指针定义一个非有效的值,防止在delete以后仍用到这个指针时出错。还有就是会在你定义一个对象时,自动为这个对象赋值零。

    从这些功能来看,有些功能还是不错的,不但方便了程序员使用也增强了程序的健壮性,但是对老版本程序的兼容就会出现问题,以前程序中编译通过的内容也许在VS2012中就没有办法通过,还是大家根据自己的习惯自行考虑是否使用这个东西吧。

    另:还有一个选择打开和关闭SDL检查的位置就是:项目属性->配置属性->C/C++->SDL检查,选测是或者否

    转自:http://blog.csdn.net/angle635/article/details/22035427

  • 相关阅读:
    【Alpha版本】 第六天 11.14
    HashMap(JDK8) 源码分析及夺命9连问
    JUC基础
    快乐的一天从AC开始 | 20210804 | CF1549C
    快乐的一天从AC开始 | 20210803 | P3482
    快乐的一天从AC开始 | 20210802 | P2034
    快乐的一天从AC开始 | 20210801 | P1988
    快乐的一天从AC开始 | 20210731 | P2825
    快乐的一天从AC开始 | 20210730 | P4656
    快乐的一天从AC开始 | 20210729 | P5346
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/8440512.html
Copyright © 2011-2022 走看看