首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

教你几招消灭代码漏洞的方法

在编程中对指针进行释放后,需要将该指针设置为NULL,以防止后续free指针的误用,从而导致UAF (Use After Free)等其他内存破坏问题。尤其在结构体、类里面存储的原始指针。...调用printf系列函数,参数必须对应 调用printf系列函数没处理好会引发中风险漏洞:信息泄露漏洞 调用printf系列函数,如sprintf,snprintf,vprintf等必须对应控制符号和参数...函数的每个分支都应该有返回值,否则如果函数走到无返回值的分支,其结果是未知的。...错误用法的范例 正确用法的范例 在多线程中变量应确保线程安全性 线程中的变量没处理好,它会引发两大中风险漏洞:信息泄露,逻辑漏洞。 当一个变量可能被多个线程使用时,应当使用原子操作或加锁操作。...错误用法范例 正确用法范例 防止Off-By-One漏洞 计算和操作数据的时候没处理好,它会引发高风险漏洞:内存破坏 在进行计算或者操作时,如果使用的最大值或最小值不正确,使得该值比正确值多1或少1

1.1K31

go常见错误总结

= nil { return } f.Process(data) f.Close() } 4 误用new和make 例如错误的使用new初始化一个map,错误使用...所以当我们需要将切片作为一个参数传递给函数时,实际就是传递了一个指针变量,并且在函数内部可以改变该变量,而不是传递一个值拷贝,所以当切片作为参数传递是,不需要解引用切片,即: 正确的做法: func findBiggest...( listOfNumbers []int ) int {} 错误的做法: func findBiggest( listOfNumbers *[]int ) int {} 6 误用指针指向一个接口类型...函数nextFew将nexter接口作为参数并读取接下来的num个字节,并返回一个切片。...但是nextFew2使用一个指向nexter接口类型的指针作为参数传递给函数,编译程序时,系统会给出一个编译错误:n.next undefined (type *nexter has no field

66350
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    理解真实项目中的 Go 并发 Bug

    根据该表显示,在收集到的 82 个 bug 中共计 36 个 bug 是因为对共享内存访问的保护错误导致的,有 46 个是因为误用消息传递导致的。...有 16 个 bug 是因为通道和其他阻塞原语一起使用造成的。比如一个协程因为通道阻塞,另一个协程因为锁或 wait 操作阻塞。 有 4 个 bug 是因为误用 Go 中的消息库造成的。...也就是说,阻塞 bug 引起的原因一般是由对共享内存的原语和消息传递到原语使用不当造成的。同时在 Go 中,错误的使用消息传递的方式导致的阻塞 bug 多余错误的使用共享内存原语,高达 58%。...匿名函数:在 Go 中可以通过匿名函数来启动协程,这样匿名函数就可以访问本地的变量,如果使用不当,就加大了数据竞争的机会。 误用 WaitGroup。...根据表 10 可知: 69% 的非阻塞 bug 可以通过严格的时间顺序进行修复,或者通过增加像 Mutex 这样的同步原语,或移动已有的同步原语到合适的未知,类似于 Add。

    46220

    好的框架需要好的 API 设计 —— API 设计的六个原则

    为了提升 API 的可理解性,我们在设计 API 的时候建议考虑这些因素: 如果没有必要,不要引入新的概念 防止误用 最好能够避免使用者写出错误的代码(即让错误的代码编译不通过) 如果上面那一条有些难度...典型的例子是实现或者调用某个函数过程: 实现某个函数的时候,函数的参数类型本来并没有见过,但通过智能感知提示我们能够了解到这个新 API 并正确取到参数中我们期望得到的信息。...调用某个函数的时候,我们需要传入本来并没有见过的参数类型,通过智能感知提示,我们能够知道如何构造或获取这些类型然后正确传进去。...如果画一个图来表示较高的可见性和较低的可见性,我想可以画成这样: ? ▲ 连接线表示可以通过函数的参数、返回值等得知的新 API 左侧的 API 没有什么规律,知道什么或者不知道什么全凭经验而定。...如果在良好的设计下预留了足够的扩展点,那么这样的 API 能够应对未来一段时间内未知的需求变化,使得 API 变化在可控范围内。

    1K10

    IDEA使用模板自动生成类注释和方法,解决方法注释在接口中或普通类的方法外使用模板注释不带参数的情况

    IDEA自动生成类注释和方法注释 类注释 方法注释 类注释 按照下方路径打开设置 File->Settings->Editor->File and Code Templates->Includes-...velocity.apache.org 方法注释 File->Settings->Editor->Live Templates 1.创建模板组 2.创建对应模板 3.修改快捷键(缩略词) 针对在接口中或普通类的方法外使用模板注释不带参数的情况...假如触发的快捷键为doc, ★在类中输入 "/doc" 触发方法注释可以带参数, ★但是下方的template text 开头要去掉"/" 为了符合注释习惯,可以将快捷键设为 * 或 **,...★在类中输入 /*或者/**可以触发带参数的方法注释 ★对应的,在template text 开头要去掉 /或者/* 相当于将快捷键替换为template text中的内容,很好理解 4.添加模板内容...}; return result", methodParameters()) 7.应用保存 参考: idea 自动生成类注释和方法注释的实现步骤

    1.4K10

    Java编程规范-缺陷预防

    ; b = c + d; a = b + e ; 2 、变量 ++ 、变量 – 、 ++ 变量、 – 变量等语句要单独占一行,不要放在其他语句中, for 循环语句除外; 示例: 【错误用法】...示例 : 【正确用法】 public volatile long cnt = 6 L; 1.9参数合法性 检查 public 和 protected 方法参数的合法性由方法的调用者负责,方法内部也需做必要的检查...默认属性方法和 private 方法参数的合法性由方法的调用者负责,方法内部可不做检查。...,不允许模块各自定义; 2、对外的非常量的实例变量,要封装 getter 和 setter 方法,不允许定义为 public 属性; 4.3覆写 1、覆写父类和接口的方法必须有 @Override 注释...JDK 自身的函数在性能和可靠性方面一般有更好的实现,大家必须熟练掌握,特别是算法方面的。

    52920

    无敌了,用Python给英语老师开发了个英语作文批改的神器(支持小学到雅思)

    怀着激动的心情,我快速地开发了一个简单的demo,下面分享一下开发过程。 调用API接口的准备工作 首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取到应用的id和密钥。...调用方式大同小异,都是将待批改内容和时间戳等信息生成的签名post到API接口,而后接口返回批改结果。...在接口输入参数中,grade为以下几类: 级别 代码 不考虑级别,单纯评价句子好坏 default 小学 elementary 初中 junior 高中 high 四级 cet4 六级 cet6 考研...、界面逻辑处理和英文作文批改接口调用方法的封装。...细分错误类别(0表示正确,1表示未知错误,2表示词汇缺失,3表示词汇冗余, 4表示冠词误用,5表示介词误用,6表示动词主谓一致错误,7表示动词时态错误,8

    3.7K41

    Java编程常见问题汇总3

    用数组来描述一个结构 错误用法: ? 这里用数组+文档的方式来描述一个方法的返回值. 虽然很简单, 但是很容易误用, 正确的做法应该是定义个类。 正确的写法: ? 对方法过度限制 错误用法: ?...正确的写法: ? 时区(Time Zone)调整的误用 错误的写法: ? 这个方法实际上没有改变时间, 输入和输出是一样的....而调用Calendar的getTime/setTime方法会自动在当前时区和UTC之间做转换。 Calendar.getInstance()的误用 错误的写法: ?...使用全局参数配置常量类/接口 ? 很多应用都会定义这样一个全局常量类或接口, 但是为什么这种做法不推荐? 因为这些常量之间基本没有任何关联, 只是因为公用才定义在一起....但是如果其他组件需要使用这些全局变量, 则必须对该常量类产生依赖, 特别是存在server和远程client调用的场景。 比较好的做法是将这些常量定义在组件内部. 或者局限在一个类库内部。

    51220

    获取 NodeJS 程序退出码

    在其他情况下使用以下状态代码: 1 未捕获的致命异常:存在未捕获的异常,并且其没有被域或 'uncaughtException' 事件句柄处理。...2: 未使用(由 Bash 保留用于内置误用) 3 内部 JavaScript 解析错误:NodeJS 引导过程中的内部 JavaScript 源代码导致解析错误。...6 非函数的内部异常句柄:存在未捕获的异常,但内部致命异常句柄不知何故设置为非函数,无法调用。 7 内部异常句柄运行时失败:存在未捕获的异常,并且内部致命异常句柄函数本身在尝试处理时抛出错误。...在以前版本的 NodeJS 中,退出码 8 有时表示未捕获的异常。 9 无效参数:指定了未知选项,或者提供了需要值的选项而没有值。...12 无效的调试参数:设置了 --inspect 和/或 --inspect-brk 选项,但选择的端口号无效或不可用。

    3.5K10

    Effective C++笔记

    尽可能使用const 将某些东西声明为const可帮助编译器侦测出错误用法。...以独立语句将new对象置入智能指针 如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露 18. 让接口容易被正确使用,不易被误用 好的接口很容易被正确使用,不容易被误用。...在public继承下从没有人希望如此 为了让被遮掩的名称再见天日,可使用using声明式或转交函数 34. 区分接口继承和实现继承 接口继承和实现继承不同。...了解隐式接口和编译器多态 class和templates都支持接口和多态 对classes而言接口是显示的,以函数签名为中心,多态则是通过virtual函数发生于运行期 对template参数而言,接口是隐式的...,往往可消除,做法是以函数参数或class成员变量替换template参数 因类型参数而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述的具现类型共享实现码 45.

    82220

    【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

    文章目录 一、泛型简介 二、泛型类 三、泛型方法 四、静态方法的泛型 五、泛型类与泛型方法完整示例 一、泛型简介 ---- 泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上...类 也可以有参数 , 将 类型 作为 参数 传入类中 ; 泛型接口 : 接口 的 参数 , 也可以是泛型 ; 将 类型 传入 泛型方法 , 泛型类 , 泛型接口 中 , 可以 动态地 指定一些类型 ;...泛型的作用 : 安全检查 : 在 编译阶段 , 就可以进行 代码检查 , 将更少的错误带到运行时 ; 避免强转 : 避免 类型的强转 导致不必要的安全问题 ; 提高性能 : 使用泛型可以 提高 Java...; 其中的 参数 , 返回值 类型是 T , 但 这个 T 是作为一个正常的类型使用的 , 并不是声明在 方法 中的泛型 ; 如果 类 , 接口 , 方法 是 泛型类 , 泛型接口 , 泛型方法 , 则该...: 如果静态方法中 使用了 类中的泛型 T , 作为参数 或 返回值 , 这种使用时错误的 ; 如果必须在 静态方法 中使用泛型 T , 则该泛型 T 必须是静态方法的泛型 , 不能是类的泛型 ; 错误用法

    15.4K30

    设计一个高质量的 API 接口

    直接返回结果数据的;相同数据,返回格式和字段名称有差别的; 错误信息: 直接返回中文提示的;返回提示信息编码的;返回异常类型的;等等 XX业务API性能方面未知。...难误用 优秀的API可以使有经验的开发直接使用API而不需要阅读文档。 充分的静态检查、动态校验、显式的异常说明、有效的错误提示。 API 设计原则 1....充分原则 不是随便一个功能就要有个接口,也不是随便一个需求就要加个接口。 每新建一个接口,要有充分的理由和考虑,即这个接口的存在是十分有意义和价值的。...比如:查询会员,可能除了查询会员表外还要获取该会员的其他必要信息,但不要在查询会员的同时还有修改权限等类似的其他业务功能,应该分成两个接口执行。 4. 简单原则 接口设计简单、清晰。...保证API的向后兼容。 扩展参数应当是便利的,保证后续类似的需求,可以在已有的API上通过兼容扩展的方式实现。 7. 最小惊讶原则 代码应该尽可能减少让读者惊喜。

    96921

    瀚海微SD NAND之SD 协议(40)SPI模式CMD8的操作

    (不包括传输响应期间的错误)*2:'Match'表示以下条件a)和b)的AND。 “不匹配”是其他情况。a) vhs中只有1位设置为“1”。b)卡支持主机电源电压。响应响应令牌有几种类型。...和SD模式一样,所有的都先传输MSB。在SPI模式下定义了多个字节响应,但是当其中指出非法命令错误或命令CRC错误时,卡只输出第一个字节(相当于R1)。在这种情况下,主机永远不会读取多个字节的响应。...Format R1该响应令牌由卡在除SEND STATus命令外的每个命令后发送。它是一个字节长,MSB总是被设置为零。其他位是错误指示,错误用1表示。R1格式的结构如下图所示。...CC error:内部卡控制器错误。Error:操作过程中发生的一般错误或未知错误。...第一个字节(MSB)的结构与响应类型R1相同。其他四个字节包含卡工作电压信息和参数中检查模式的回显,并由与SD模式中的R7响应相同的定义指定。

    8410

    Rust避坑Java空指针异常

    这里的 "->" 是 Java 8 引入的 lambda 表达式语法。在这个上下文中,它代表一个函数接口的简写形式。箭头左边的 name 是参数。它代表 Optional 中的值,如果存在的话。...2.2 Rust编译器对误用Option不修复不罢休Rust如何避坑类似上面的”Java编译器无视对Optional的误用“的情况?答案是Rust编译器会报告误用Option的错误情况。...函数可能失败或没有返回值时。数据结构中的可选字段。初始化可能失败的资源。作为函数参数,表示该参数是可选的。在并发编程中安全地共享可能不存在的数据。第2-7行模拟数据库查询。...它用于访问模块中的项,或者调用关联函数(类似于其他语言中的静态方法)。from 方法是 String 类型上的一个关联函数。它是 From trait 的一部分,这个 trait 用于类型转换。"...第15-18行是main 函数,分别调用 print_name 函数,传入参数 1 和 2。

    30161

    一套优雅的 Go 错误问题解决方案

    ,那么这一行中的 err 变量和函数最前面定义的 (err error) 不是同一个变量,因此即便在此处发生了错误,但是在 defer 函数中无法捕获到 err 变量了。...= nil 的统一模式,来判断一个调用是不是成功了。 但是随着 Go 的逐步推广,由于 error 接口的高自由度,程序员们对于 “如何判断该错误是什么错误” 的时候,出现了分歧。...敏感信息一旦暴露,轻则安全教育,重则高压线伺候 还是类似上面的方法,返回统一的错误码,message 则直接用一个通用的 “unknown error” 或 ”未知错误,请联系 XXX“ 之类的提示信息...至于后台侧,还是需要实实在在地将这个哈希值和具体的错误信息记录在日志或者其他支持搜索的渠道里。当用户提供该代码时,可以快速定位。...这种 hashcode 的错误代码生成方法,仅适用于错误用例遗漏、或者是快速迭代过程中,用于发现和调试遗漏的错误用例的临时方案。

    1.7K20

    Effective C++: 改善程序与设计的55个具体做法

    ■ 对于形似函数的宏(macros),最好改用inline函数替换#defines。 条款03:尽可能使用const 请记住 ■ 将某些东西声明为 const可帮助编译器侦测出错误用法。...如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。 条款18:让接口容易被正确使用,不易被误用 请记住 ■ 好的接口很容易被正确使用,不容易被误用。...■ 为了让被遮掩的名称再见天日,可使用 using 声明式或转交函数(forwardingfunctions)。 条款34:区分接口继承和实现继承 ■ 接口继承和实现继承不同。...■ 对 template 参数而言,接口是隐式的(implicit),奠基于有效表达式。...■ 因非类型模板参数(non-type template parameters)而造成的代码膨胀,往往可消除,做法是以函数参数或class成员变量替换template参数。

    72020

    人非圣贤孰能无过,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang错误处理机制EP11

    返回错误     Go lang的错误(error)也是一种数据类型,错误用内置的error 类型表示,就像其他的数据类型的,比如字符串、整形之类,错误的具体值可以存储在变量中,从函数中返回: package...如果一个函数返回一个错误,那么理论上,它肯定是函数返回的最后一个值,因为在执行阶段中可能会返回正常的值,而错误位置是未知的,所以,handle函数返回的值是最后一个值。    ...,当然了,请求过程中有可能发生一些未知错误,所以我们使用err变量获取Get方法的最后一个返回值,如果err不是nil,那么就说明请求过程中报错了,这里打印具体错误,然后从主函数中返回。    ...任何实现这个接口的类型都可以作为一个错误使用。这个函数可以打印出具体错误的说明。     ...Get "123123": unsupported protocol scheme ""     这里我们把超时(Timeout)和其他错误区分开来,分别进入不同的错误处理逻辑。

    16230

    重构:撰写合格的代码

    从软件开发的角度看:宏和函数是接口,类和数据结构是接口,库(library)和包(package)是接口,环境变量是接口,消息类型和网络协议是接口,系统调用是接口,软硬中断是接口,EABI 是接口。...合理的名称 合理的输入输出 符合惯例(convention) 很难误用或滥用 合理的名称的重要性是不言而喻的,这样使用你的代码的人不会产生迟疑和困惑。...合理的输入输出是指接口不要期待过于复杂的输入(比如函数的参数不宜超过五个),如无必要,不要依赖输入以外的数据,而且输入参数包含的数据只需刚好满足相关的需求即可,不要传入无关紧要的数据;对于输出,和输入一个道理...中唯一的字符串,第二个参数是一个字符串,第三个参数是一个仅包含若干个 Key 的 object,第四个参数是秩是 1-3 之间的一个函数。...唯有此,才能最大程度地把问题消灭在萌芽,同时让你的接口的使用者不断从错误提示中学习,直到正确调用接口为止。

    1K80
    领券