主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

CERT C:Rec.DCL00-C

Const-qualify immutable objects

描述

规则定义

Const-qualify immutable objects.1

Polyspace 实现

规则检查项检查是否存在未修改的变量未具有 const 限定符

示例

全部展开

问题

未修改的变量未声明为 const 发生在本地变量未声明为 const- 且在变量生命周期内满足以下条件之一时:

  • 在初始化后,您不应对该变量执行写操作。

  • 执行写操作时,将相同的常量值重新分配给变量。

检查项将变量视为已修改,如果其地址被赋给指针或引用(除非它是指向 const 变量的指针或引用)、传递给另一个函数或以其他方式使用。在这些情况下,检查项不会建议添加 const 修饰符。

只有在初始化后完全未对数组元素执行写操作的情况下,检查项才会将数组标记为 const-qualification 的候选项。检查项不会标记整数、浮点、枚举或布尔类型的函数参数。

风险

const-对变量进行修饰符限定可以避免在后续代码维护过程中意外修改该变量。const 修饰符还向开发人员表明,该变量在代码的其余部分中保留其初始值。

修复

如果您预计在变量的生命周期内不会修改其值,请在变量声明中添加 const 修饰符,并在声明时初始化该变量。

如果预期变量会被修改,请检查变量未被修改是否表示编程遗漏,并修复相关问题。

示例 - 指针上缺少 const 资格
#include <string.h>

char returnNthCharacter (int n) {
    char* pwd = "aXeWdf10fg" ; //Noncompliant
    char nthCharacter;
        
    for(int i=0; i < strlen(pwd); i++) {
        if(i==n)
            nthCharacter = pwd[i];
    }
    return nthCharacter;
}

在此示例中,指针 pwd 没有 const 限定符。然而,除了用常量进行初始化之外,在 returnNthCharacter 函数中没有任何地方重新赋值。

更正 - 在变量声明中添加 const

如果该变量不打算被修改,则在声明时添加 const 修饰符。在此示例中,指针和被指变量均未被修改。在指针和被指针变量上都添加一个 const 限定符。后面的修改不能将指针 pwd 重新分配给另一个变量,也不能修改所指位置的值。

#include <string.h>

char returnNthCharacter (int n) {
    const char* const pwd = "aXeWdf10fg" ; //Compliant
    char nthCharacter;
        
    for(int i=0; i < strlen(pwd); i++) {
        if(i==n)
            nthCharacter = pwd[i];
    }
    return nthCharacter;
}

请注意,检查项只标记指针声明中缺失的 const。检查项不会确定所指向的位置是否也需要 const 修饰符。

检查信息

组:Rec.02.声明和初始化 (DCL)

版本历史记录

在 R2020b 中推出

全部展开


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.