ID: 482 類型:變量 |
狀態:草稿 |
描述
代碼在打算執行賦值的時候使用了比較操作符。
擴展描述
很多語言中比較語句同賦值語句非常接近,很容易造成混淆。
關聯視圖
與“研究層面”視圖(CWE-1000)相關
與“開發層面”視圖(CWE-699)相關
引入模式
階段 |
說明 |
實現 |
T這個bug主要是由打字錯誤引發。 |
應用平臺
語言
C (出現的可能性不確定)
C++ (出現的可能性不確定)
後果
範圍 |
衝擊 |
可能性 |
可利用性 |
技術衝擊: 意外狀態 賦值不會發生,這會導致明顯的程序執行問題。 |
被利用的可能性:
低
示例
例1
(問題代碼)
Example Language: Java
void called(int foo) {
foo==1;
if (foo==1) System.out.println("foo\n");
}
int main() {
called(2);
return 0;
}
例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;
}
push方法包括一個表達式,用於將整數值賦給指針變量指向的堆棧中的位置。
但是,此表達式使用比較運算符“=”,而不是賦值運算符“=”。使用比較運算符而不是賦值運算符的結果會導致將錯誤的值輸入堆棧,並可能導致意外的結果。
應對措施
階段: 測試 許多集成環境以及靜態分析工具都可以檢查出這個問題。 |
種屬
關係 |
類型 |
ID |
名稱 |
屬於 |
|
747 |
CERT C Secure Coding Standard (2008) Chapter 14 - Miscellaneous (MSC) |
屬於 |
|
883 |
|
屬於 |
|
886 |