当前位置: 首页 > news >正文

MISRA 2012学习笔记(3)-Rules 8.4-8.7

文章目录

    • Rules
      • 8.4 字符集和词汇约定(Character sets and lexical conventions)
        • Rule 4.1 八进制和十六进制转译序列应有明确的终止识别标识
        • Rule 4.2 禁止使用三字母词(trigraphs)
      • 8.5 标识符(Identifiers)
        • Rule 5.1 外部标识符不得重名
        • Rule 5.2 同范围和命名空间内的标识符不得重名
        • Rule 5.3 内部声明的标识符不得隐藏外部声明的标识符
        • Rule 5.4 宏标识符不得重名
        • Rule 5.5 宏标识符与其他标识符不得重名
        • Rule 5.6 typedef 名称应是唯一标识符
        • Rule 5.7 标签(tag)名称应是唯一标识符
        • 全局(external linkage)对象和函数的标识符应是唯一的
        • Rule 5.9 局部全局(internal linkage)对象和函数的标识符应是唯一的
      • 8.6 类型(Types)
        • Rule 6.1 位域(位带)仅允许使用适当的类型来声明(位域成员类型限制)
        • Rule 6.2 单比特(single-bit)位域成员不可声明为有符号类型
      • 8.7 字符和常量(Literals and constants)
        • Rule 7.1 禁止使用八进制常数
        • Rule 7.2 后缀“u”或“U”应使用于所有无符号的整数常量
        • Rule 7.3 小写字符“l”不得作为常量的后缀使用(仅可使用“L”)
        • Rule 7.4除非对象的类型为“指向 const char 的指针”,否则不得将字符串常量赋值给该对象

Rules

8.4 字符集和词汇约定(Character sets and lexical conventions)

Rule 4.1 八进制和十六进制转译序列应有明确的终止识别标识

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

展开:八进制或十六进制转义序列应通过以下任一方式来标识其已终止:

•另一个转义序列的开始,或

•字符常量的结尾或字符串的结尾

原理:如果十进制或十六进制转义序列后面跟着其他字符,可能会造成混淆。例如,字符常量’\x1f’由单个字符组成,而字符常量’\x1g’由两个字符’\x1’和’g’组成。将多字符常量表示为整数的方式是由实现定义的。

如果给字符常量或字符串文字中的每个八进制或十六进制转义序列增加显示的终止标识,则可以减少混淆的可能性。

示例:在此示例中,由 s1,s2 和 s3 指向的每个字符串都等效于字符串“Ag”

const char *s1 = "\x41g"; /* Non-compliant */
const char *s2 = "\x41" "g"; /* Compliant - terminated by end of literal */
const char *s3 = "\x41\x67"; /* Compliant - terminated by another escape */
int c1 = '\141t'; /* Non-compliant */
int c2 = '\141\t'; /* Compliant - terminated by another escape */

Rule 4.2 禁止使用三字母词(trigraphs)

等级:建议

分析:可判定,单一编译单元

适用:C90,C99

原理:三字母词(或叫三联符序列)由两个问号起始,后跟一个特定字符组成。

注意:复合字母(“<:” “:>” “<%” “%>” “%:” “%:%:”)是被允许的,因为它们只是标记符。

示例:比如字符串

"(Date should be in the form ??-??-??)"
会被编译器解析为
"(Date should be in the form ~~]"

8.5 标识符(Identifiers)

Rule 5.1 外部标识符不得重名

等级:必要

分析:可判定,系统范围

适用:C90,C99

展开:本准则要求不同的外部标识符在实现的有效范围内的字符是不同的。

“不重名”取决于实现和所使用的 C 语言版本:

•在 C90 中,最小有效字符范围是前 6 个字符,且不区分大小写;

•在 C99 中,最小有效字符范围是前 31 个字符,而其通用字符和扩展字符的有效范围是 6 到 10 个字符

实际上,许多实际的使用环境(编译环境)提供了更大的限制。 例如,通常 C90 中的外部标识符区分大小写,并且至少前 31 个字符有意义。

原理:如果两个标识符仅在非有效字符上不同,则实际行为无法确定。

如果考虑到可移植性,则应谨慎使用“标准”中指定的最低限制来应用此规则。

长标识符可能会损害代码的可读性。 尽管许多自动代码生成系统生成的标识符很长,但是有一个很好的论据可以将标识符长度保持在此限制之下。

注意:在C99中,如果扩展源字符出现在外部标识符中,并且该字符没有对应的通用字符,则标准不会指定它占用多少字符。

示例:在下面的示例中,所有定义都出现在同一个编译单元中。所讨论的实现在外部标识符中支持31个区分大小写的字符。

/* 1234567890123456789012345678901********* Characters */
int32_t engine_exhaust_gas_temperature_raw;
int32_t engine_exhaust_gas_temperature_scaled; /* Non-compliant */
/* 1234567890123456789012345678901********* Characters */
int32_t engine_exhaust_gas_temp_raw;
int32_t engine_exhaust_gas_temp_scaled; /* Compliant */

超过32个字符后的变量不同,是违法规则的。

在以下违规示例中,该实现在外部标识符中支持 6 个不区分大小写的字符。 两个编译单元中的标识符不同,但在主要特征上并没有区别。

/* file1.c */ 
int32_t abc = 0;
/* file2.c */ 
int32_t ABC = 0;

不应存在大小写可能一样的变量,或者函数,这样编译的时候可能会报错。

Rule 5.2 同范围和命名空间内的标识符不得重名

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

展开:如果两个标识符都是外部标识符,则本准则不适用,因为此情况适用于 Rule 5.1。

如果每个标识符都是宏标识符,则本准则不适用,因为这种情况已被 Rule 5.4 和 Rule 5.5 涵盖。

“不重名”的定义取决于实现和所使用的 C 语言版本:

•在 C90 中,最低要求是前 31 个字符有效

•在 C99 中,最低要求是前 63 个字符有效,通用字符或扩展源字符视为一个字符。

原理:如果两个标识符仅在非有效字符上不同,则实际行为无法确定。

如果考虑到可移植性,则应谨慎使用“标准”中指定的最低限制来应用此规则。

长标识符可能会损害代码的可读性。 尽管许多自动代码生成系统生成的标识符很长,但是有一个很好的论据可以将标识符长度保持在此限制之下。

示例:在下面的示例中,所讨论的实现为:在不具有全局属性的标识符中支持 31 个区分大小写的字符。

/* 1234567890123456789012345678901********* Characters */
extern int32_t engine_exhaust_gas_temperature_raw;
static int32_t engine_exhaust_gas_temperature_scaled; /* Non-compliant */
void f ( void )
{/* 1234567890123456789012345678901********* Characters */int32_t engine_exhaust_gas_temperature_local; /* Compliant */
}
/* 1234567890123456789012345678901********* Characters */
static int32_t engine_exhaust_gas_temp_raw;
static int32_t engine_exhaust_gas_temp_scaled; /* Compliant */

跟5.1类似,这里指的是局部或静态变量

Rule 5.3 内部声明的标识符不得隐藏外部声明的标识符

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

展开:内部范围声明的标识符应与外部范围声明的标识符不重名。

“不重名”的定义取决于实现和所使用的 C 语言版本:

•在 C90 中,最低要求是前 31 个字符有效

•在 C99 中,最低要求是前 63 个字符有效,通用字符或扩展源字符视为一个字符。

原理:如果在内部作用域中声明一个标识符,与在外部作用域中已经存在的标识符重名,则最内部的声明将“隐藏”外部的声明。 这可能会导致开发人员混乱。

注意:在一个名称空间中声明的标识符不会隐藏在另一个名称空间中声明的标识符

术语“内部作用域”和“外部作用域”定义如下:

•具有文件作用域的标识符可以被认为具有最外层作用域;

•文件内模块间可识别的范围,作用域较小,相对最大范围,视为内部作用域;

•连续的嵌套块,引入更多的内部作用域。

示例:

void fn1 ( void )
{int16_t i; /*  定义变量 "i" */{int16_t i; /*  违规 - 会隐藏前面定义的 "i"  */i = 3; /*  这里的 "i" 是指前面哪一个, 会产生混淆  */}
}
struct astruct
{int16_t m;
};
extern void g ( struct astruct *p );
int16_t xyz = 0; /* 定义变量 "xyz" */
void fn2 ( struct astruct xyz ) /* 违规 - 外部定义的 "xyz" 被同名形参隐藏  */
{g ( &xyz );
}
uint16_t speed;
void fn3 ( void )
{typedef float32_t speed; /* 违规 - 类型将变量给隐藏  */
}

Rule 5.4 宏标识符不得重名

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

展开:该规则要求,当定义宏时,其名称与:

•当前定义的其他宏的名称,和

•参数的名称。

“不重名”的定义取决于实现和所使用的 C 语言版本:

•在C90中,最低要求是宏标识符的前31个字符是有效的;

•在C99中,最低要求是宏标识符的前63个字符是有效的。

在实践中,实现可能提供更大的限制。该规则要求宏标识符在实现所施加的限制内是不同的。

原理:如果两个宏标识符仅非有效字符不同,则其实际实现行为不可预知。 由于宏参数仅在其宏扩展期间处于活动状态,因此一个宏中的参数与另一宏中的参数混淆不会有问题

考虑到可移植性,则应谨慎使用“标准”中指定的最低限制来应用此准则。

过长的宏标识符可能会损害代码的可读性。 尽管许多自动代码生成系统会生成很长的宏标识符,但有一个很好的论据认为宏标识符的长度应远低于此限制。

注意:在C99中,如果扩展源字符出现在宏名称中,并且该字符没有相应的通用字符,则标准不会指定它占用多少字符。

示例:在下面的示例中,所讨论的实现在宏标识符中支持31个重要的区分大小写的字符。

/* 1234567890123456789012345678901********* Characters */
#define engine_exhaust_gas_temperature_raw egt_r
#define engine_exhaust_gas_temperature_scaled egt_s /* Non-compliant */
/* 1234567890123456789012345678901********* Characters */
#define engine_exhaust_gas_temp_raw egt_r
#define engine_exhaust_gas_temp_scaled egt_s /* Compliant */

Rule 5.5 宏标识符与其他标识符不得重名

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

展开:该规则要求预处理前存在的宏的名称与预处理后存在的标识符不同。它适用于标识符,而不考虑其作用域或名称空间,也适用于已定义的任何宏,而不考虑在声明标识符时定义是否仍然有效。

根据所使用的C 语言的实现和版本,“不重名”的定义不相同:

•在C90中,最低要求是前31个字符是有效的;

•在C99中,最低要求是前63个字符是有效的,每个通用字符或扩展源字符计数为单个字符

原理:保持宏名称和标识符不同有助于避免开发人员混淆

示例:在下面的不兼容示例中,类似函数的宏Sum的名称也用作标识符。对象Sum的声明不受宏展开的约束,因为它后面没有“(”字符。因此,在执行了预处理之后,标识符仍然存在。

#define Sum(x, y) ( ( x ) + ( y ) )
int16_t Sum;

下面的示例是兼容的,因为预处理后没有标识符Sum的实例

#define Sum(x, y) ( ( x ) + ( y ) )
int16_t x = Sum ( 1, 2 );

在下面的示例中,假定有效字符长度为 31 且区分大小写。该示例违规,因为宏名称与标识符的前 31 个字符完全相同。

/* 1234567890123456789012345678901********* Characters */
#define low_pressure_turbine_temperature_1 lp_tb_temp_1
static int32_t low_pressure_turbine_temperature_2;

Rule 5.6 typedef 名称应是唯一标识符

等级:必要

分析:可判定,系统范围

适用:C90,C99

展开:类型定义名称在所有名称空间和翻译单元中应该是唯一的。只有当类型定义在头文件中并且该头文件包含在多个源文件中时,该规则才允许对相同的typedef名称进行多个声明。

原理:如果多个 typedef 名称命名相同而它们实际指代又是不同的函数、对象或枚举常量时,开发人员会被困扰

例外:typedef 名称可以与和 typedef 相关联的结构、联合或枚举标记(tag)名称相同。

void func ( void )
{{typedef unsigned char u8_t;}{typedef unsigned char u8_t; /* Non-compliant - reuse */}
}
typedef float mass;
void func1 ( void )
{float32_t mass = 0.0f; /* Non-compliant - reuse */
}
typedef struct list
{struct list *next;uint16_t element;
} list; /* Compliant - exception */
typedef struct
{struct chain{struct chain *list;uint16_t element;} s1;uint16_t length;
} chain; /* Non-compliant - tag "chain" not* associated with typedef */

Rule 5.7 标签(tag)名称应是唯一标识符

等级:必要

分析:可判定,系统范围

适用:C90,C99

展开:标签(tag)在所有名称空间和单位翻译中应是唯一的。

标签(tag)的所有声明应指定相同的类型。

仅当在头文件中声明标签(tag)并且该头文件被多个源文件包含时,此准则才允许使用同一标签(tag) 的多个完整声明。
与 typedef 名称相同,这种情况下,所有声明都是完全相同的,且由于头文件防止多次包含的举措,也不会出现多个声明

原理:重用标签(tag)名称可能会导致开发人员混乱。

例外:标签(tag)名称可能与与其关联的 typedef 名称相同。

struct stag
{
uint16_t a; 
uint16_t b;
};
struct stag a1 = { 0, 0 }; /* 合规 - 与前面的定义一致 */
union stag a2 = { 0, 0 }; /* 违规 - 与声明的 struct stag 不一致。
* 同时也违背了C99的约束 */

下述的示例也违背了 Rule 5.3:

struct deer
{
uint16_t a; 
uint16_t b;
};
void foo ( void )
{
struct deer
{
uint16_t a;
};/* 违规 - 标签 "deer" 重复使用 */
}
typedef struct coord
{
uint16_t x; 
uint16_t y;
} coord;/* 合规 - 符合例外情况 */struct elk
{uint16_t x;
};
struct elk /*  违规 - 同一个标签被声明为不同的类型* 同时也违背了C99的约束 */
{uint32_t x;
};

全局(external linkage)对象和函数的标识符应是唯一的

等级:必要

分析:可判定,系统范围

适用:C90,C99

展开:用作外部标识符的标识符不得在任何命名空间或编译单元中用于任何其他目的,即使它没有链接的对象。

原理:强制标识符名称的唯一性有助于避免混淆。没有链接对象的标识符不必是唯一的,因为混淆风险很小
示例:下面的示例中,“file1.c”和“file2.c”是同一个项目的一部分。

/* file1.c */
int32_t count; /* "count" 具有全局属性(全局变量) */
void foo ( void ) /* "foo" 具有全局属性(全局函数) */
{int16_t index; /* "index" 无全局属性(临时变量) */
}
/* file2.c */
static void foo ( void ) /* 违规 - “ foo”不唯一(在file1.c中有全局属
* 性的同名函数) */int16_t count; /* 违规 - "count" 没有全局属性, 但与另一文
* 件的有全局属性的变量重名 */int32_t index; /* 合规 - "index"无全局属性(临时变量) */
}

全局变量不能与局部变量名称一样,全局函数不能与局部函数名称一致。

Rule 5.9 局部全局(internal linkage)对象和函数的标识符应是唯一的

等级:必要

分析:可判定,系统范围

适用:C90,C99

展开:标识符名称在所有命名空间和编译单元中都应该唯一。任何标识符都不应与任何其他标识符具有相同的名称,即使该其他标识符没有链接的对象也是如此。

原理:强制标识符名称的唯一性有助于避免混淆。
例外:可以在一个以上的转换单元中定义具有局部属性的内联函数,条件是所有这些定义都在每个转换单元中包含的同一头文件中进行。即:定义在头文件中的内联函数,不受限制

示例:下面的示例中,“file1.c”和“file2.c”是同一个项目的一部分。

/* file1.c */
static int32_t count; /* "count" 局部全局属性 */
static void foo ( void ) /*  "foo" 局部全局属性 */
{int16_t count; /* 违规 - "count" 没有全局属性, 但与有局部全
* 局属性的标识符冲突 */int16_t index; /* "index" 无全局属性 */
}
void bar1 ( void )
{static int16_t count; /*  违规 - "count" 没有全局属性, 但与有局部全
* 局属性的标识符冲突 */int16_t index; /* 合规 - "index" 不唯一但它没有与其冲突的具全
* 局属性的标识符 */foo ( );
}
/* End of file1.c */
/* file2.c */
static int8_t count; /* 违规 - "count" 具有局部全局属性, 与另一个
* 具有局部全局属性的标识符重复 */
static void foo ( void ) /* 违规 - "foo" 具有局部属性, 与另一个具有局
* 部属性的函数标识符重复 */
{int32_t index; /*  合规 - "index" 和 "nbytes" " */int16_t nbytes; /* 不唯一, 但因都不具全局属性, 因而不冲突 */
}
void bar2 ( void )
{static uint8_t nbytes; /* 合规 - "nbytes" 不唯一, 但它没有全局属性,
* 全局属性与存储类别无关 */
}
/* End of file2.c */

内部链接(internal linkage)翻译为局部全局,即被“static”修饰的全局变量和函数
静态全局变量不能与局部变量/局部静态变量同名,也不能与其他文件的静态全局变量同名。静态全局函数也不能与其他文件的静态全局函数同名。

8.6 类型(Types)

Rule 6.1 位域(位带)仅允许使用适当的类型来声明(位域成员类型限制)

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

展开:“适当的”位域类型为:

•C90: unsigned int或signed int;

•C99:下列之一:

-无符号整型或有符号整型;

-实现允许的另一种显式有符号或显式无符号整数类型;

—_Bool

注意:允许使用typedef来指定适当的类型。
原理:使用int是实现定义的,因为int类型的bit-fields字段可以是有符号的也可以是无符号的

在C90中不允许使用enum、short、char或任何其他类型的bit-fields字段,因为该行为是未定义的。

在C99中,实现可以定义在bit-fields字段声明中允许的其他整数类型。

示例:以下示例适用于不提供任何其他位域类型的 C90 和 C99 实现。假定 int 类型为 16 位。

typedef unsigned int UINT_16;
struct s {unsigned int b1:2; /* 合规 */int b2:2; /* 违规 - 不允许使用不明确符号的"int" */UINT_16 b3:2; /* 违规 - 不允许使用不明确符号的"int" */signed long b4:2; /* 违规 - 即使 long 和 int 大小相同 */
};

该定义一般用在寄存器定义中,字段的数据类型一般都保持一致

Rule 6.2 单比特(single-bit)位域成员不可声明为有符号类型

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

原理:根据 C99 标准第 6.2.6.2 节,一个单比特(single-bit)带符号的位域数据具有 1 个符号位和 0 个值位。

在任何整数表示中,0 个值位都无法指定有意义的值。如果定义会对编程人员产生疑问。

尽管C90标准没有提供太多关于类型表示的细节,但同样的考虑也适用于C99

注意:此规则不适用于未命名的位字段,因为它们的值不能被访问

8.7 字符和常量(Literals and constants)

Rule 7.1 禁止使用八进制常数

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

原理:开发人员编写带有前导零的常量时,可能希望它们被解释为十进制常量。八进制常数的表述方式:0xx。

注意:此规则不适用于八进制转义序列,因为使用前导字符\意味着混淆的空间更小

例外:整数常数零(写为“0”)严格来说是八进制常数,但是是本准则的允许例外。

示例:

extern uint16_t code[ 10 ];
code[ 1 ] = 109; /* Compliant - decimal 109 */
code[ 2 ] = 100; / * Compliant - decimal 100 */
code[ 3 ] = 052; /* Non-Compliant - decimal 42 */
code[ 4 ] = 071; /* Non-Compliant - decimal 57 */

八进制数一般不会在嵌入式中使用,此处也规定不能使用

Rule 7.2 后缀“u”或“U”应使用于所有无符号的整数常量

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

展开:此规则适用于:

•在预处理指令#if和#elif的控制表达式中出现的整型常量;

预处理后存在的任何其他整型常量。

注:在预处理过程中,整型常量的类型确定与预处理后相同,不同之处在于:

•所有有符号整数类型的行为就像它们是long (C90)或intmax_t (C99);

•所有无符号整数类型的行为就像它们是unsigned long (C90)或uintmax_t (C99)

原理: 整数常量的类型是潜在的混淆源,因为它取决于多种因素的复杂结合,包括:

•常数的大小;

•实现的整数类型的大小;

•任何后缀的存在;

•表示值的基数(即十进制、八进制或十六进制)。

例如,整数常数40000在32位环境中是signed int类型,但在16位环境中是signed long类型。值0x8000在16位环境中是无符号int类型,但在32位环境中是有符号int类型。

注意:

•任何带有“U”后缀的值都是unsigned类型;

•小于2^31的无后缀十进制值为有符号类型

•大于或等于2^15的无后缀十进制值为有符号类型号或无符号类型

•对于 C90,大于或等于 2^31的无后缀十进制值可能是有符号或无符号类型

常量的符号应该是显式的。如果常量是无符号类型,则应用“U”后缀可以清楚地表明程序员理解该常量是无符号

注意:该规则不依赖于使用常量的上下文;可应用于常数的提升和其他转换与确定是否符合此规则无关

示例:以下示例假定计算机具有 16 位 int 类型和 32 位 long 类型。它显示了根据标准确定的每个整数常量的
类型。整数常量 0x8000 不符合标准,因为它具有无符号类型,但没有“ U”后缀。

Rule 7.3 小写字符“l”不得作为常量的后缀使用(仅可使用“L”)

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

原理:在声明文字时,使用大写后缀“L”可消除“1”(数字 1)和“l”(字母“ el”)之间的潜在歧义。

示例:

const int64_t a = 0L;
const int64_t b = 0l; /* Non-compliant */
const uint64_t c = 0Lu;
const uint64_t d = 0lU; /* Non-compliant */
const uint64_t e = 0ULL;
const uint64_t f = 0Ull; /* Non-compliant */
const int128_t g = 0LL;
const int128_t h = 0ll; /* Non-compliant */ 
const float128_t m = 1.2L;
const float128_t n = 2.4l; /* Non-compliant */

Rule 7.4除非对象的类型为“指向 const char 的指针”,否则不得将字符串常量赋值给该对象

等级:必要

分析:可判定,单一编译单元

适用:C90,C99

展开:不得尝试直接修改字符串常量或宽字符串常量。

除非对象的类型为“指向 const char 型数组的指针”,否则对字符串常量取地址(&运算符修饰)的结果不得赋值给该对象

同样的,此限制也适用于宽字符串常量。 除非对象的类型是“指向 const wchar_t 的指针”,否则不得将宽字符串常量赋值给该对象。 除非该对象的类型是“指向 const wchar_t 数组的指针”,否则对宽字符串常量取地址(&运算符)的结果不得赋值给该对象。

原理:对字符串常量的修改结果无法预知。例如,某些实现可能会将字符串常量存储在只读存储器中,在这种情况下,尝试修改字符串常量将失败,并且还可能导致异常或崩溃。

此规则可防止误修改字符串常量。

在 C99 标准中,并未明确指定是否将共享共同结尾的字符串常量存储在不同的内存位置中。因此,即使尝试修改字符串常量看起来成功了,也可能会无意中更改了另一个字符串。

示例:下面示例显示了直接修改字符串常量的尝试:

"0123456789"[0] = '*'; /* 违规 */

这些示例描述了如何防止间接修改字符串常量。

/* 违规 - s 缺少 const 修饰 */
char *s = "string";
/* 合规 - p 有 const 修饰; 其他限定词是可接受的 */
const volatile char *p = "string";
extern void f1 ( char *s1 );
extern void f2 ( const char *s2 );
void g ( void )
{f1 ( "string" ); /* 违规 - 形参 s1 缺少 const 修饰 */f2 ( "string" ); /* 合规 */
}
char *name1 ( void )
{return ( "MISRA" ); /* 违规 - 返回类型缺少 const 修饰 */
}
const char *name2 ( void )
{return ( "MISRA" ); /*  合规 */
}

指针对象需要定义为const char,才可以赋值字符串常量

相关文章:

MISRA 2012学习笔记(3)-Rules 8.4-8.7

文章目录 Rules8.4 字符集和词汇约定(Character sets and lexical conventions)Rule 4.1 八进制和十六进制转译序列应有明确的终止识别标识Rule 4.2 禁止使用三字母词(trigraphs) 8.5 标识符(Identifiers)Rule 5.1 外部标识符不得重名Rule 5.2 同范围和命名空间内的标识符不得重…...

centos7组件搭建

Linux&#xff08;包括centos&#xff09; 如何查看服务器内存、CPU su - root 切换用户 centos 密码 空格 https://blog.csdn.net/weixin_45277161/article/details/131524555 CentOS 7 安装 Docker 的详细步骤 https://blog.csdn.net/qq_39997939/article/details/13100…...

webpack5和webpack4的一些区别

自动清除打包目录 webpack4 // bash npm i clean-webpack-plugin -D //webpack.config.js const {CleanWebpackPlugin} require(clean-webpack-plugin); module.exports {plugins: [new CleanWebpackPlugin()} } webpack5 module.exports {output: {clean: true} } topLevel…...

攻防世界-fileclude

原题 解题思路 直接展示源码了&#xff0c;flag.php应该存放了flag&#xff0c;在file1与file2都不为空且file2是“hello ctf”时file1将被导入。接下来做法很明显&#xff0c;让file为flag.php&#xff0c;file2为“hello ctf”。“?file1php://filter/readconvert.base64-en…...

深度学习的“前世今生”

1、“感知机”的诞生 20世纪50年代&#xff0c;人工智能派生出了这样两个学派&#xff0c;分别是“符号学派”及“连接学派”。前者的领军学者有Marvin Minsky及John McCarthy&#xff0c;后者则是由Frank Rosenblatt所领导。 “符号学派”的人相信对机器从头编程&#xff0c…...

第一百一十九回 如何通过蓝牙设备读写数据

文章目录 概念介绍实现方法示例代码经验总结我们在上一章回中介绍了如何获取蓝牙状态相关的内容,本章回中将介绍 如何通过蓝牙设备读写数据。闲话休提,让我们一起Talk Flutter吧。 概念介绍 通过蓝牙设备读写数据有两种方法: 一种是读写Characteristics;一种是读写Descri…...

linux:Temporary failure in name resolutionCouldn’t resolve host

所有域名无法正常解析。 ping www.baidu.com 等域名提示 Temporary failure in name resolution错误。 rootlocalhost:~# ping www.baidu.com ping: www.baidu.com: Temporary failure in name resolution rootlocalhost:~# 一、ubuntu/debian&#xff08;emporary failure i…...

C 语言的 sprintf() 函数

<stdio.h> 原型: int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串。 参数 str – 这是指向一个字符数组的指针&#xff0c;该数组存储了 C 字符串。 format – 这是字符串&#xff0c;包含了要被写入到字符串 str 的文本。它…...

李沐pytorch学习-卷积网络及其实现

一、卷积概述 1.1 基本定义 卷积计算过程如图1所示&#xff0c;即输入矩阵和核函数&#xff08;filter&#xff09;对应的位置相乘&#xff0c;然后相加得到输出对应位置的数。 图1. 卷积计算过程 该过程可以形象地从图2中展现。 图2. 二维卷积示意图 1.2 实现互相关运算的代…...

记录:win10物理机ping不通虚拟机上的docker子网(已解决)

【说明】 windows10&#xff1a;已关闭防火墙 linux发行版本&#xff1a;centos7.9&#xff08;已禁用SElinux、已关闭防火墙&#xff09; 虚拟机软件&#xff1a;VMware Workstation 17 虚拟机网络模式&#xff1a;NAT模式 docker版本&#xff1a;20.4.5 docker网络模式…...

深入浅出Pytorch函数——torch.nn.init.kaiming_normal_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

D. Anton and School - 2

范德蒙德恒等式 考虑统计每一个右括号位置的贡献&#xff0c;也就是每个右括号作为右边起点的贡献 其中i0的时候&#xff0c;r-1<r-0,故i0时贡献为0&#xff0c;直接套用恒等式不会有影响 #include <bits/stdc.h> using namespace std; typedef long long int ll; # d…...

xcode把包打到高版本的iPhone里

打开xcode CTRLb build工程&#xff0c;build成功 把手机连到mac&#xff0c;在xcode选项卡里面的window里面选中device and simulator 打开对应的手机的页面 然后在工程目录下build成功过后有一个product的文件夹里面&#xff0c;直接把app拖到对应的手机的窗口就可以不用…...

PMP项目管理考试小结

一、初步了解 每年有多次考试的机会&#xff0c;大概每三-四个月有一次考试机会&#xff0c;我下面分享的是我考试&#xff1a; 考试时间&#xff1a;8月19日 上午9:00-12:50 考试地点&#xff1a;北京市丰台区首都经济贸易大学&#xff08;城市不一样考点不一样&#xff09; …...

【NAS群晖drive异地访问】使用cpolar远程访问内网Synology Drive「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...

【傅里叶级数与傅里叶变换】数学推导——2、[Part2:T = 2 π的周期函数的傅里叶级数展开] 及 [Part3:周期为2L的函数展开]

文章内容来自DR_CAN关于傅里叶变换的视频&#xff0c;本篇文章提供了一些基础知识点&#xff0c;比如三角函数常用的导数、三角函数换算公式等。 文章全部链接&#xff1a; 基础知识点 Part1&#xff1a;三角函数系的正交性 Part2&#xff1a;T2π的周期函数的傅里叶级数展开 P…...

【IMX6ULL驱动开发学习】06.DHT11温湿度传感器驱动程序编写与测试

一、DHT11简介 DHT11是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加湿。 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器&#xff0c;具有超小体积、极低功耗的特点…...

sip开发从理论到实践,让你快速入门sip

目录 引言&#xff1a; sip协议是什么&#xff1f; sip的网络结构&#xff08;重点&#xff09; sip的特点 sip使用的url sip协议的应用领域 sip协议基本的消息类型 请求消息 响应消息 sip协议的消息结构&#xff08;这个是重点&#xff09; sip的常见会话流程&#xf…...

十三、Linux中必须知道的几个快捷键!!!

1、强制停止 当某些代码正在运行时&#xff0c;你想让其停止&#xff0c;只需要按下如下快捷键即可&#xff1a; 【CTRL】【C】 示例&#xff1a; 2、退出 Linux系统自带python3解释器&#xff0c;当你进入python3解释器之后&#xff0c;需要退出时&#xff0c;只需要按下&am…...

Django进阶-文件上传

普通文件上传 定义 用户可以通过浏览器将图片等文件上传到网站 场景 用户上传头像 上传流动性的文档【pdf&#xff0c;txt】等 上传规范-后端 1.视图函数中&#xff0c;用request。FILES取文件框的内容 file request.FILES[xxx] 说明&#xff1a; 1.FILES的key对应页面中…...

clickhouse-数据导入导出方案

一、简介 clickhouse有多种数据的导入导出方式&#xff0c;可以灵活使用&#xff0c;下面对这些方式分别做些介绍&#xff0c;导入导出的写法与格式和格式设置有关。 二、导入 1.从s3导入 详情可查看官网&#xff0c;也可以在这里获取数据集 -- 建库建表 CREATE DATABASE …...

[JavaWeb]【一】入门JavaWeb开发总概及HTML、CSS、JavaScript

目录 一 特色 二 收获​编辑 三 什么是web? 四 网站的工作流程 五 web网站的开发模式​编辑 六 web开发课程学习安排 七、初始web前端 八 HTML、CSS 8.1 什么是HTNL\CSS(w3cschool) 8.2 HTML快速入门 8.3 VS Code开发工具 8.3.1 插件 8.3.2 主题&#xff08;改变颜色&…...

Python自动化小技巧18——自动化资产月报(word设置字体表格样式,查找替换文字)

案例背景 每月都要写各种月报&#xff0c;经营管理月报&#xff0c;资产月报.....这些报告文字目标都是高度相似的&#xff0c;只是需要替换为每个月的实际数据就行&#xff0c;如下&#xff1a; (打码是怕信息泄露.....) 可以看到&#xff0c;这个报告的都是高度模板化&…...

FFmpeg5.0源码阅读——VideoToobox硬件解码

摘要&#xff1a;本文描述了FFmpeg中videotoobox解码器如何进行解码工作&#xff0c;如何将一个编码的码流解码为最终的裸流。   关键字&#xff1a;videotoobox,decoder,ffmpeg   VideoToolbox 是一个低级框架&#xff0c;提供对硬件编码器和解码器的直接访问。 它提供视频…...

IDEA 中Tomcat源码环境搭建

一、从仓库中拉取源代码 配置仓库地址、项目目录&#xff1b;点击Clone按钮&#xff0c;从仓库中拉取代码 Tomcat源码对应的github地址&#xff1a; https://github.com/apache/tomcat.git 二、安装Ant插件 打开 File -> Setting -> Plugins 三、添加Build文件 &…...

MATLAB | 七夕节用MATLAB画个玫瑰花束叭

Hey又是一年七夕节要到了&#xff0c;每年一次直男审美MATLAB绘图大赛开始hiahiahia&#xff0c;真的这些代码越写越不知道咋写&#xff0c;又不想每年把之前的代码翻出来再发一遍&#xff0c;于是今年又对我之前写的老代码进行了点优化组合&#xff0c;整了个花球变花束&#…...

嵌入式开发之configure

1 前述 在Linux的应用或者驱动开发过程中&#xff0c;编写makefile是无法避免的问题&#xff0c;但是由于makefile的各种规则&#xff0c;或显式&#xff0c;或隐式&#xff0c;非常多&#xff0c;不经常写的话&#xff0c;很难写出一个可用的makefile文件。为了“偷懒”&…...

深入浅出Pytorch函数——torch.nn.Module

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 Pytorch中所有网络的基类&#xff0c;我们的模型也应该继承这个类。Modules也可以包含其它Modules,允许使用树结构嵌入他们&#xff0c;我们还可以将子模块赋值给模型属性。 语法 torch.nn.Module(*args, **kwargs)方法 …...

【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程

目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新&#xff1a; 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…...

STM32--TIM定时器(3)

文章目录 输入捕获简介频率测量输入捕获通道输入捕获基本结构PWMI的基本结构输入捕获模式测量PWM频率和占空比代码 编码器接口正交编码器工作模式接口基本结构TIM编码接口器测速代码&#xff1a; 输入捕获简介 输入捕获IC(Input Capture)&#xff0c;是处理器捕获外部输入信号…...

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单&#xff0c;功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细&#xff0c;可以直接上手。 基本命令&#xff1a; 创建爬虫项目 feapder create -p first-project创建爬虫 …...

设计模式详解-享元模式

类型&#xff1a;结构型模式 实现原理&#xff1a;尝试重用现有的同类对象&#xff0c;如果未找到匹配的对象&#xff0c;则创建新对象 目的&#xff1a;减少创建对象的数量以减少内存占用和提高性能。 解决的问题&#xff1a;大量的对象可能造成的内存溢出问题 解决方法&a…...

BDA初级分析——用SQL筛选数据

一、用SQL对数据分组 GROUP BY Group by&#xff0c;按...分组 作用:根据给定字段进行字段的分组&#xff0c;通常和聚合函数配合使用&#xff0c;实现分组的分析 写法:select ...from ...group by 字段名 (也可以是多个字段) GROUP BY的逻辑 SELECT gender,COUNT(user_id) …...

(成功踩坑)electron-builder打包过程中报错

目录 注意&#xff1a;文中的解决方法2&#xff0c;一定全部看完&#xff0c;再进行操作&#xff0c;有坑 背景 报错1&#xff1a; 报错2&#xff1a; 1.原因&#xff1a;网络连接失败 2.解决方法1&#xff1a; 3.解决方法2&#xff1a; 3.1查看缺少什么资源文件 3.2去淘…...

【STM32】 工程

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TO…...

Git概述

目录 一、什么是Git 二、什么是版本控制系统 三、Git和SVN对比 SVN集中式 SVN优缺点 Git分布式 Git优缺点 四、Git工作流程 四个工作区域 工作流程 五、Git下载与安装 一、什么是Git 很多人都知道&#xff0c;林纳斯托瓦兹在1991年创建了开源的Linux&#xff0c;从…...

ubuntu 编译安装nginx及安装nginx_upstream_check_module模块

如果有帮助到你&#xff0c;麻烦点个赞呗&#xff5e; 一、下载安装包 # 下载nginx_upstream_check_module模块 wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master# 解压 unzip master# 下载nginx 1.21.6 wget https://github.com/nginx/…...

近 2000 台 Citrix NetScaler 服务器遭到破坏

Bleeping Computer 网站披露在某次大规模网络攻击活动中&#xff0c;一名攻击者利用被追踪为 CVE-2023-3519 的高危远程代码执行漏洞&#xff0c;入侵了近 2000 台 Citrix NetScaler 服务器。 研究人员表示在管理员安装漏洞补丁之前已经有 1200 多台服务器被设置了后门&#x…...

MySQL MVCC的详解之Read View

文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制 三、参考 概要 在上文中&#xff0c;我们提到了MVCC&#xff08;Multi-Version Concurrency Control)多版本并发控制&#xff0c;是通过undo log来实现的。那具…...

基于springboot+vue的考研资讯平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

学习网络编程No.3【socket理论实战】

引言&#xff1a; 北京时间&#xff1a;2023/8/12/15:32&#xff0c;自前天晚上更新完文章&#xff0c;看了一下鹅厂新出的《扫毒3》摆烂至现在&#xff0c;不知道是长大了&#xff0c;还是近年港片就那样&#xff0c;给我的感觉不是很好&#xff0c;也可能是国内市场对港片不…...

Linux学习之ssh和scp

ls /etc/ssh可以看到这个目录下有一些文件&#xff0c;而/etc/ssh/ssh_config是客户端配置文件&#xff0c;/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息&#xff0c;发现这个配置端口是22…...

录制游戏视频的软件有哪些?分享3款软件!

“有录制游戏视频的软件推荐吗&#xff1f;最近迷上了网游&#xff0c;想录制点自己高端操作的游戏画面&#xff0c;但是不知道用什么软件录屏比较好&#xff0c;就想问问大家&#xff0c;有没有好用的录制游戏视频软件。” 在游戏领域&#xff0c;玩家们喜欢通过录制游戏视频…...

每日一题——螺旋矩阵

题目 给定一个m x n大小的矩阵&#xff08;m行&#xff0c;n列&#xff09;&#xff0c;按螺旋的顺序返回矩阵中的所有元素。 数据范围&#xff1a;0≤n,m≤10&#xff0c;矩阵中任意元素都满足 ∣val∣≤100 要求&#xff1a;空间复杂度 O(nm) &#xff0c;时间复杂度 O(nm)…...

前端面试的性能优化部分(12)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分&#xff08;1&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;2&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;3&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;4&#xff09;每天…...

SAP BTEs 业务交易事件/增强(Business Transaction Event)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、BTEs是什么&#xff1f; 二、使用步骤 1.查找BTE event 2.处理FM 总结 前言 SAP BTEs是一种新型的增强方式&#xff0c;可以通过事务代码FIFB打开&#…...

leetcode做题笔记90. 子集 II

给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列。 思路一&#xff1a;回溯 int comp(const void* a, cons…...

“开发和运维”只是一个开始,最终目标是构建高质量的软件工程

随着技术的飞速发展&#xff0c;软件行业不断寻求改进和创新的方法来提供更高质量的产品。在这方面&#xff0c;DevOps已经展现出了巨大的潜力。通过打破开发和运维之间的壁垒&#xff0c;DevOps将持续集成、持续交付和自动化流程引入到软件开发中&#xff0c;使团队能够更快地…...

自学C#,要懂得善用MSDN

很多初学者学习编程&#xff0c;都会通过看别人写的教程、或者录制的视频&#xff0c;来学习。 这是一个非常好的途径&#xff0c;因为这个是非常高效的。 但是这样&#xff0c;存在两个问题&#xff1a; 1、教程不够全面&#xff1a;任何再好的教程&#xff0c;都无法囊括所…...

mac上如何压缩视频大小?

mac上如何压缩视频大小&#xff1f;由于视频文件体积庞大&#xff0c;常常会占据我们设备的大量存储空间。通常情况下&#xff0c;我们选择删除视频以释放内存&#xff0c;但这将永久丢失它们。然而&#xff0c;有一种更好的方法可以在不删除视频的情况下减小内存占用&#xff…...