ID: 480 类型:基础 | 状态:草稿 |
描述
程序员不小心使用了错误的运算符,从而以安全相关的方式更改了应用程序逻辑。
扩展描述
这些类型的错误通常是打字错误的结果。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
实现 |
应用平台
语言
C (有时出现)
C++ (有时出现)
Perl (有时出现)
Class: 语言无关 (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
其它 | 技术冲击: 修改执行逻辑 这个弱点会导致执行意外的逻辑和其他意外的应用程序行为。 |
被利用的可能性:
低
示例
例1
下面的C/C++和C++示例试图验证INT输入参数相对于整数值100。(问题代码)
Example Language: C
int isValid(int value) {
if (value=100) {
printf("Value is valid\n");
return(1);
}
printf("Value is not valid\n");
return(0);
}
(问题代码)
Example Language: C#
bool isValid(int value) {
if (value=100) {
Console.WriteLine("Value is valid.");
return true;
}
Console.WriteLine("Value is not valid.");
return false;
}
但是,在if语句中计算的表达式使用赋值运算符“=”,而不是比较运算符“==”。使用赋值运算符而不是比较运算符的结果将导致局部重新分配int变量,并且if语句中的表达式将始终计算为表达式右侧的值。这将导致输入值未正确验证,从而导致意外结果。
例2
下面的C/C++示例展示了一个简单的堆栈,包括用于从堆栈中添加和移除整数值的方法。该示例使用指针向堆栈数组变量添加和删除整数值。(问题代码)
Example Language: C
#define SIZE 50
int *tos, *p1, stack[SIZE];
void push(int i) {
p1++;
if(p1==(tos+SIZE)) {
// Print stack overflow error message and exit
}
*p1 == i;
}
int pop(void) {
if(p1==tos) {
// Print stack underflow error message and exit
}
p1--;
return *(p1+1);
}
int main(int argc, char *argv[]) {
// initialize tos and p1 to point to the top of stack
tos = stack;
p1 = stack;
// code to add and remove items from stack
...
return 0;
}
但是,此表达式使用比较运算符“==”,而不是赋值运算符“=”。使用比较运算符而不是赋值运算符的结果会导致将错误的值输入堆栈,并可能导致意外的结果。
种属
关系 | 类型 | ID | 名称 |
属于 | 747 | CERT C Secure Coding Standard (2008) Chapter 14 - Miscellaneous (MSC) | |
属于 | 871 | ||
属于 | 883 | ||
属于 | 884 | ||
属于 | 977 | ||
属于 | 1157 | SEI CERT C Coding Standard - Guidelines 03. Expressions (EXP) |